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吗?
答案 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解决了问题。