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) 中有相同的调用——这些方法也没有任何定义。

所以,有两个问题:

  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_mailerand alias_method_chain,你基本上破坏了这段代码,因为它永远不会再次触发。现在发送电子邮件的原因是可以通过两种方式设置邮件扩展程序;

  • 如果Radiant::Config['mailer.post_to_page?']true,邮件表单将发布到当前 url。例如,它将 POST 到 domain.tld/contact,然后 Radiant 在该路径中找到该页面,并对其进行处理。多亏了alias_method_chain,它将查明表单是否刚刚发布,然后执行实际发送邮件的操作。
  • 如果Radiant::Config['mailer.post_to_page?']不正确(或未设置),则联系表单将 POST 到类似 domain.tld/pages/:id/mail 的内容。该请求不是由 Radiant 的 SiteController 处理的,而是由 MailController 处理的,它不使用 process_with_mailer。第二个显然是您的情况,正如您所说,在注释掉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 回答