首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ActiveModel和ActionMailer

ActiveModel和ActionMailer
EN

Stack Overflow用户
提问于 2011-11-26 12:36:04
回答 2查看 416关注 0票数 0

带有mail gem 2.3.0的Rails 3.1.2

我正在尝试将ActionMailer与基于ActiveModel的表单一起使用。我已经这样定义了我的无表模型:

代码语言:javascript
复制
class StprodApp 
  include ActiveModel::Validations
  include ActiveModel::Conversion
  extend ActiveModel::Naming
  attr_accessor :email,:name
  attr_reader :errors
  validates_presence_of :email, :message => "Please enter your email address"
  def initialize(attributes = {})
    attributes.each do |name, value|
    send("#{name}=", value)
   end
   @errors = ActiveModel::Errors.new(self)
 end
 def persisted?
   false
 end
end

到目前为止一切顺利,我可以发布一个基于stprod_app的表单,并且验证工作

因此,现在我想基于此模型发送一封电子邮件,因此我在我的创建操作中执行以下操作:

代码语言:javascript
复制
@stprod_app = StprodApp.new(params[:stprod_app])
if @stprod_app.valid?
  EmployeeMailer.stprod_app(@stprod_app).deliver
end

我得到了这个错误

代码语言:javascript
复制
undefined method `index' for #<StprodApp:0x007f95325a1ad0>

这个堆栈跟踪

代码语言:javascript
复制
mail (2.3.0) lib/mail/encodings.rb:117:in `value_decode' 
mail (2.3.0) lib/mail/encodings.rb:101:in `decode_encode'
mail (2.3.0) lib/mail/fields/unstructured_field.rb:74:in `do_decode'
mail (2.3.0) lib/mail/fields/unstructured_field.rb:56:in `decoded'
mail (2.3.0) lib/mail/fields/unstructured_field.rb:107:in `wrapped_value'
mail (2.3.0) lib/mail/fields/unstructured_field.rb:70:in `do_encode'
mail (2.3.0) lib/mail/fields/unstructured_field.rb:52:in `encoded'
mail (2.3.0) lib/mail/field.rb:123:in `method_missing'
mail (2.3.0) lib/mail/header.rb:190:in `block in encoded'
mail (2.3.0) lib/mail/header.rb:189:in `each'
mail (2.3.0) lib/mail/header.rb:189:in `encoded'
mail (2.3.0) lib/mail/message.rb:1708:in `encoded'
actionmailer (3.1.2) lib/action_mailer/base.rb:451:in `set_payload_for_mail'
actionmailer (3.1.2) lib/action_mailer/base.rb:431:in `block in deliver_mail'
activesupport (3.1.2) lib/active_support/notifications.rb:53:in `block in
instrument'
activesupport (3.1.2) lib/active_support/notifications/instrumenter.rb:21:in
`instrument'
activesupport (3.1.2) lib/active_support/notifications.rb:53:in `instrument'
actionmailer (3.1.2) lib/action_mailer/base.rb:430:in `deliver_mail'
mail (2.3.0) lib/mail/message.rb:230:in `deliver'
app/controllers/stprod_app_controller.rb:20:in `create'

所以我阅读了mail gem的文档,上面写着:

-剪接

所有可以渲染到电子邮件中的对象都有一个#编码的方法。Encoded将以完整字符串的形式返回对象,以便在邮件系统中发送,也就是说,它将在末尾包含头部字段和值以及CRLF,并根据需要进行包装。

所有可以呈现到电子邮件中的对象都有一个:decoded方法。Decoded将只以字符串的形式返回对象的“值”。这意味着它将不包含标题字段(如'To:‘或'Subject:')。

默认情况下,在容器对象上调用#to_s将调用其编码方法,而在字段对象上调用#to_s将调用其解码方法。因此,在邮件对象上调用#to_s将返回邮件,所有编码的邮件都可以发送,而在From字段或body上调用#to_s将返回对象的解码值。Mail的header对象被认为是一个容器。如果您有疑问,请显式调用#encoded或#decoded,如果您不确定,这会更安全。

当您针对对象调用参数名称作为方法时,具有可编码参数值的结构化字段(例如Content-Type)将提供已解码的参数值。

当您通过object.parameters'‘方法调用参数名称时,具有可编码参数值的结构化字段(例如Content-Type)将提供编码的参数值。

-剪接

看起来索引错误是Rail最后一次尝试解码/编码?电子邮件。我在rails中找到的唯一有意义的“索引”是在ActiveSupport::Multibyte::Chars中。

听起来我必须在我的ActiveModel中实现一个编码/解码方法,但是我不知道如何实现!

有人知道如何定义与ActionMailer一起工作的ActiveModel吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-11-26 22:05:39

解决了,省去了一个关键的细节,塞林解决了这个问题

我将Stprod_app实例变量传递给邮件调用:

代码语言:javascript
复制
def stprod_app(emp,app)
  @app = app
  @emp = emp
  mail(:to=> @app.antibot, 
    :from=>@emp.email, 
    :app=>@app) # <<< DOH!!!!

抱歉的!

票数 0
EN

Stack Overflow用户

发布于 2012-09-29 00:59:48

我在下面的代码中遇到了类似的错误:

代码语言:javascript
复制
def report( request )
  headers['environment'] = RAILS_ENV
  headers['identifier'] = request.id

  ...
end

在本例中,它无法对request.id进行编码,因为它是数字。将其更改为request.id.to_s解决了问题。

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

https://stackoverflow.com/questions/8276323

复制
相关文章

相似问题

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