我的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
有人能发现我做错了吗?
答案 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?
。