首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Rails:发送电子邮件,获取未定义的方法`model_name‘for Mail::Message:Class

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

Stack Overflow用户
提问于 2012-02-12 20:49:08
回答 1查看 2.4K关注 0票数 1

我的Rails技能(坦率地说)是生疏的,所以这可能是一个新手问题。我正在尝试创建一个简单的电子邮件发送表单,但我不断收到:

代码语言:javascript
复制
NoMethodError in Mail#create
undefined method `model_name' for Mail::Message:Class

我很确定我的问题出在我的控制器上,相关的方法看起来是这样的:

代码语言:javascript
复制
def create
  @mail = Mail.new(params[:mail])
  MailMailer.send_mail(@mail).deliver
end

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

代码语言:javascript
复制
class Mail < ActiveRecord::Base
  include ActiveModel::Validations
  validates :password, :presence => true
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

我的邮件看起来是这样的:

代码语言:javascript
复制
class MailMailer < ActionMailer::Base
  def send_mail(mail)
    mail(:to => mail.to, :subject => mail.subject)
  end
end

有人能发现我做错了什么吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-02-13 02:50:01

你的问题可能就在这里:

代码语言:javascript
复制
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的混合是另一个奇怪的迹象。

在您的评论中,您注意到创建此模型时使用:

代码语言:javascript
复制
$ rails g model mail

这试图创建一个数据库支持的ActiveRecord模型,因为这几乎总是人们想要的。您可能还会遇到麻烦,因为Mail已经在使用中,所以您可能希望使用不同的名称。

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

代码语言:javascript
复制
class SomeEmail
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

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

代码语言:javascript
复制
class SomeEmail
  include ActiveModel::Validations
  validates :password, :presence => true
  attr_accessor :password, :to, :cc, :bcc, :from, :subject, :message
end

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

最后,仅仅添加attr_accessor并不能为您提供有用的构造函数,因此在进行上述所有更改后,如下所示:

代码语言:javascript
复制
@mail = SomeMail.new(params[:mail])

仍然不会做你想做的事情,因为params[:mail]中的任何东西都不会保存在任何地方。因此,向您的email类添加一个initialize实现,并向您的控制器添加一个对valid?的调用。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9248912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档