【问题标题】:"wrong argument type" exception when using ActionMailer in Rails 3在 Rails 3 中使用 ActionMailer 时出现“错误的参数类型”异常
【发布时间】:2013-09-05 19:37:27
【问题描述】:

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

TypeError: 错误的参数类型 Class (expected Module) 来自 /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 > 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 (expected Module) 来自 /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 > 

【问题讨论】:

  • 您是否在程序中的任何地方使用了include?然后告诉我们。 TypeError: wrong argument type Class (expected Module) 清楚地表明您在 include 部分中使用了类名。

标签: ruby-on-rails ruby ruby-on-rails-3


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

【讨论】:

    猜你喜欢
    • 2011-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    相关资源
    最近更新 更多