我在任何不包含邮件功能的页面上运行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
) 中有相同的调用——这些方法也没有任何定义。
所以,有两个问题:
- 为什么在任何页面加载
process_with_mailer
期间调用? - 背后的魔力是
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 好吧,我最终得到了
- 阅读Ruby on Rails:alias_method_chain,它到底是做什么的?
- 注释掉
process_with_mailer
和alias_method_chain
。在该配置上它发送电子邮件,所以这是可以接受的。我仍然想知道,作者的总体想法是什么。