带有mail gem 2.3.0的Rails 3.1.2
我正在尝试将ActionMailer与基于ActiveModel的表单一起使用。我已经这样定义了我的无表模型:
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的表单,并且验证工作
因此,现在我想基于此模型发送一封电子邮件,因此我在我的创建操作中执行以下操作:
@stprod_app = StprodApp.new(params[:stprod_app])
if @stprod_app.valid?
EmployeeMailer.stprod_app(@stprod_app).deliver
end我得到了这个错误
undefined method `index' for #<StprodApp:0x007f95325a1ad0>这个堆栈跟踪
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吗?
发布于 2011-11-26 22:05:39
解决了,省去了一个关键的细节,塞林解决了这个问题
我将Stprod_app实例变量传递给邮件调用:
def stprod_app(emp,app)
@app = app
@emp = emp
mail(:to=> @app.antibot,
:from=>@emp.email,
:app=>@app) # <<< DOH!!!!抱歉的!
发布于 2012-09-29 00:59:48
我在下面的代码中遇到了类似的错误:
def report( request )
headers['environment'] = RAILS_ENV
headers['identifier'] = request.id
...
end在本例中,它无法对request.id进行编码,因为它是数字。将其更改为request.id.to_s解决了问题。
https://stackoverflow.com/questions/8276323
复制相似问题