我的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])。我的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有人能发现我做错了什么吗?
发布于 2012-02-13 02:50:01
你的问题可能就在这里:
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]中的任何东西都不会保存在任何地方。因此,向您的email类添加一个initialize实现,并向您的控制器添加一个对valid?的调用。
https://stackoverflow.com/questions/9248912
复制相似问题