0

メーラー機能を含まないページでRadiant メーラー拡張機能 を実行すると問題が発生します。SystemStackError in SiteController#show_page問題を引き起こすモジュールがあることがわかりました:

Module MailerProcess
  include RecaptchaMailer

  def self.included(base)
    base.class_eval {
      alias_method_chain :process, :mailer
      attr_accessor :last_mail
    }
  end

  def process_with_mailer(request, response)
    # If configured to do so, receive and process the mailer POST
    if Radiant::Config['mailer.post_to_page?'] && ... 
       # here process_mail from RecaptchaMailer called - works fine 
    end
    process_without_mailer(request, response)
  end
end

そして、process_without_mailerこれが私を完全に混乱させるものです-そのような定義はありません。この方法では、実際にはログに多くの「SHOW TABLES」が発生し、最終的に例外が発生します。このメソッドは多かれ少なかれ Rails の一部であると思われます。actionpack-2.3.18/lib/action_controller/filters.rb( process_without_filters)、rails-4.0.0/guides/source/active_support_core_extensions.md( process_without_stringified_params) などに同じ呼び出しがあるためです。これらのメソッドにも定義はありません。

したがって、2 つの質問があります。

  1. ページの読み込みprocess_with_mailerに呼び出されるのはなぜですか?
  2. 背後にある魔法は何process_without_mailerですか?

更新:

わかりました、メソッドをコメントアウトすると、process_with_mailer起動時にエラーが発生します:

/home/sab/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-2.3.18/lib/active_support/core_ext/module/aliasing.rb:34:in `alias_method': undefined method `process_with_mailer' for class `Page' (NameError)
        from /home/sab/.rvm/gems/ruby-1.9.3-p448/gems/activesupport-2.3.18/lib/active_support/core_ext/module/aliasing.rb:34:in `alias_method_chain'
        from /home/sab/_work/radiant-cms/vendor/extensions/mailer/lib/mailer_process.rb:6:in `block in included'
        from /home/sab/_work/radiant-cms/vendor/extensions/mailer/lib/mailer_process.rb:5:in `class_eval'

そのため、ページが読み込まれるたびにメソッドが呼び出される可能性alias_method_chainがありますが、メカニズムは私にはわかりません。ActiveSuppor のドキュメントをいくつか見つけました。

UPD2 よく私は終わった

  1. Ruby on Rails: alias_method_chain を読んで、それは正確に何をしますか?
  2. コメントアウトprocess_with_maileralias_method_chain. その構成ではメールを送信するので、それは受け入れられます。私はまだ知りたいのですが、著者の一般的な考えは何でしたか.
4

1 に答える 1

0

alias_method_chain本当に理解できるまで、記事をもう一度読んでください。それは確かに呼び出されるprocess_with_mailerたびにトリガーするものです。process

process_with_mailerとをコメントアウトすることでalias_method_chain、このコードが再びトリガーされることはないため、本質的にこのコードが壊れたことになります。メールが送信されるようになったのは、メーラー拡張機能を 2 つの方法で設定できるためです。

  • の場合、メーラー フォームRadiant::Config['mailer.post_to_page?']true現在の URL に投稿します。たとえば、domain.tld/contact に POST すると、Radiant はそのパスでページを見つけて処理します。のおかげでalias_method_chain、フォームが投稿されたばかりかどうかを調べて、実際にメールを送信することを行います。
  • true でない (または設定されていない)場合Radiant::Config['mailer.post_to_page?']、お問い合わせフォームは domain.tld/pages/:id/mail などに POST します。このリクエストは、Radiant の SiteController ではなく、process_with_mailer を使用しない MailController によって処理されます。をコメントアウトした後、電子メールが適切に送信されるようになったとあなたが言うように、2番目は明らかにあなたのケースですalias_method_chain

SystemStackError の原因を正確に特定するには、より完全なエラー メッセージが必要です。ただし、貼り付けたもの (activesupport-2.3.18) から判断すると、更新されていないにもかかわらず、Radiant 1.1.3 でこの拡張機能を使用しようとしています。 4 年後.. 実際に recaptcha 機能を使用していますか? そうでない場合は、このフォークをドロップして、ベースとなっている「通常の」メーラー拡張機能を使用することをお勧めします: https://github.com/radiant/radiant-mailer-extension

于 2013-08-29T20:57:25.770 に答える