我完全失去了这个。在Rails 3.2.12应用程序中,我正在尝试使用ActionMailer发送电子邮件并获取此异常:
TypeError:错误的参数类型Class(预期模块) 来自/Users/trcull/.rvm/gems/ruby-1.9.3-p125@featureviz/gems/actionpack-3.2.12/lib/abstract_controller/helpers.rb:153:in"include'
我把我的邮件剥离到最低限度。它甚至没有发送邮件!这是完整的:
class SupportNewUserMailer < ActionMailer::Base
def new_user
puts "hi"
end
end
说真的,就是这样。然后我像这样从Rails控制台调用它并获得异常:
1.9.3p125:001&gt; SupportNewUserMailer.new_user
不知道这里发生了什么。我在同一个应用程序中有另一个邮件程序,它工作正常。
另外,如果它们是相关的,这是我在开发中的配置:
config.action_mailer.default_url_options = { :host => 'localhost:3000' }
config.action_mailer.delivery_method = :smtp
config.action_mailer.perform_deliveries = true
config.action_mailer.raise_delivery_errors = true
config.action_mailer.smtp_settings = {
:authentication => :plain,
:address => "smtp.mailgun.org",
:port => 587,
:domain => "redacted",
:user_name => "redacted",
:password => "redacted"
}
PS:是的,我尝试将其声明为类方法(即使文档说没有)并得到相同的结果:
class SupportNewUserMailer < ActionMailer::Base
def self.new_user
puts "hi"
end
end
收率:
TypeError:错误的参数类型Class(预期模块) 来自/Users/trcull/.rvm/gems/ruby-1.9.3-p125@featureviz/gems/actionpack-3.2.12/lib/abstract_controller/helpers.rb:153:in"include'
PPS:不,找到课程不是问题。如果我将声明更改为此(注意,不再继承自ActionMailer :: Base):
class SupportNewUserMailer
def self.new_user
puts "hi"
end
end
然后我可以毫无错误地调用它,并按预期将“hi”打印到屏幕上:
1.9.3p125 :001 > SupportNewUserMailer.new_user
hi
=> nil
1.9.3p125 :002 >
答案 0 :(得分:1)
我对自己的问题有部分答案,但我不明白为什么会有效,并希望知道更好的解释。
如果我只是为我的班级使用不同的名字,它可以正常工作。所以,例如,这很好用:
class NewUserMailer < ActionMailer::Base
def new_user()
puts "hi"
end
end
这似乎暗示在类名开头使用“支持”一词是不好的。但我尝试了一个不同的类名,也以“支持”开头,并且工作正常:
class SupportStackOverflowMailer < ActionMailer::Base
def new_user()
puts "hi"
end
end
它特别是它不喜欢的名称“SupportNewUserMailer”。我已经确认我的项目中没有任何一个具有相同名称的类(尽管谁知道某个gem是否存在?)。是否存在某种类元缓存的东西?
编辑:
终于明白了。我在/ lib下声明了一个“SupportNewUserMailerHelper”类。显然Rails试图通过一些爆炸性的自动化精灵将该类作为我的邮件程序类的助手。删除帮助程序类可以解决问题。