ActiveModel和ActionMailer

时间:2011-11-26 04:36:04

标签: ruby-on-rails

Rails 3.1.2 with mail gem 2.3.0

我正在尝试将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'

所以我阅读了邮件gem的文档,它说:

--- ---剪断

可以渲染到电子邮件中的所有对象都有#encoded方法。编码将返回对象作为准备在邮件系统中发送的完整字符串,也就是说,它将包括头字段和值以及最后的CRLF并根据需要进行包装。

可以呈现到电子邮件中的所有对象都具有:已解码的方法。已解码将仅将对象的“值”作为字符串返回。这意味着它不会包含标题字段(例如“收件人:”或“主题:”)。

默认情况下,在容器对象上调用#to_s将调用其编码方法,而字段对象上的#to_s将调用其解码方法。因此,在Mail对象上调用#to_s将返回邮件,所有编码都已准备好发送,而在From字段上调用#to_s或正文将返回对象的解码值。 Mail的标头对象被视为容器。如果您有疑问,请明确调用#encoded或#decoded,如果您不确定,这会更安全。

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

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

--- ---剪断

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

听起来我必须在我的ActiveModel中实现编码/解码方法,但我无法弄清楚如何!

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

2 个答案:

答案 0 :(得分:0)

解决了,留下了一个关键细节,然后解决问题

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

def stprod_app(emp,app)
  @app = app
  @emp = emp
  mail(:to=> @app.antibot, 
    :from=>@emp.email, 
    :app=>@app) # <<< DOH!!!!

抱歉!

答案 1 :(得分:0)

我从这段代码中得到了类似的错误:

def report( request )
  headers['environment'] = RAILS_ENV
  headers['identifier'] = request.id

  ...
end

在这种情况下,它无法编码request.id,因为它是数字。将其更改为request.id.to_s解决了问题。