Rails:发送电子邮件,为Mail :: Message:Class获取未定义的方法`model_name'

时间:2012-02-12 12:49:08

标签: ruby-on-rails ruby actionmailer

我的Rails技能(有点)生锈,所以这可能是一个新手问题。我正在尝试创建一个简单的电子邮件发送表单,但我一直在:

NoMethodError in Mail#create
undefined method `model_name' for Mail::Message:Class

我很确定我的问题出在我的控制器中,相关的方法如下:

def create
  @mail = Mail.new(params[:mail])
  MailMailer.send_mail(@mail).deliver
end

认为此行导致错误@mail = Mail.new(params[:mail])。 My Mail模型类如下所示:

class Mail < ActiveRecord::Base
  include ActiveModel::Validations
  validates :password, :presence => true
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

我的邮件看起来像这样:

class MailMailer < ActionMailer::Base
  def send_mail(mail)
    mail(:to => mail.to, :subject => mail.subject)
  end
end

有人能发现我做错了吗?

1 个答案:

答案 0 :(得分:2)

你的问题可能就在这里:

class Mail < ActiveRecord::Base
  # ---------^^^^^^^^^^^^^^^^^^
  include ActiveModel::Validations
  validates :password, :presence => true
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

子类化ActiveRecord::Base并包括ActiveModel::Validations有点奇怪,因为AR已包含所有验证内容。混合AR和attr_accessor是另一个表明奇怪发生的迹象。

在您的评论中,您注意到您使用以下内容创建了此模型:

$ rails g model mail

这会尝试创建一个支持数据库的ActiveRecord模型,因为它几乎总是人们想要的。您可能也遇到麻烦,因为Mail已在使用中,因此您可能希望使用其他名称。

如果您只想要一个只是临时数据包的模型,那么您可以这样做:

class SomeEmail
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

您可能不需要此处的验证,但可以添加它们:

class SomeEmail
  include ActiveModel::Validations
  validates :password, :presence => true
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

但除非您手动调用valid?,否则不会触发验证,因此没有多大意义。

最后,只是添加attr_accessor并没有给你一个有用的构造函数,因此所有上述更改都是:

@mail = SomeMail.new(params[:mail])

仍然无法执行您想要的操作,因为params[:mail]中的任何内容都不会保存在任何地方。因此,在您的电子邮件类中添加initialize实施,并向您的控制器调用valid?