1

我完全迷失了这个。在 Rails 3.2.12 应用程序中,我尝试使用 ActionMailer 发送电子邮件并收到此异常:

类型错误:来自 /Users/trcull/.rvm/gems/ruby-1.9.3-p125@featureviz/gems/actionpack-3.2.12/lib/abstract_controller/helpers.rb:153:in 的参数类型类错误(预期模块) `包括'

我已经把我的邮件精简到了最低限度。它甚至不发送邮件!这是它的全部内容:

class SupportNewUserMailer < ActionMailer::Base
  def new_user
    puts "hi"
  end
end

说真的,就是这样。然后我像这样从 Rails 控制台调用它并得到异常:

1.9.3p125:001 > 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

产量:

类型错误:来自 /Users/trcull/.rvm/gems/ruby-1.9.3-p125@featureviz/gems/actionpack-3.2.12/lib/abstract_controller/helpers.rb:153:in 的参数类型类错误(预期模块) `包括'

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 > 
4

1 回答 1

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 试图通过一些爆炸式的自动魔法将这个类作为我的邮件类的助手。删除助手类解决了这个问题。

于 2013-09-05T20:08:30.493 回答