【问题标题】:ActiveModel and ActionMailerActiveModel 和 ActionMailer
【发布时间】:2011-11-26 04:36:04
【问题描述】:

带有邮件 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'

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

---剪辑---

所有可以呈现为电子邮件的对象都有一个#encoded 方法。 Encoded 会将对象作为一个完整的字符串返回,准备好在邮件系统中发送,也就是说,它将在末尾包含 header 字段和 value 以及 CRLF 并根据需要进行包装。

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

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

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

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

---剪辑---

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

听起来我必须在我的 ActiveModel 中实现编码/解码方法,但我不知道怎么做!

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

【问题讨论】:

  • 您可以为您的EmployeeMailer 添加代码吗?这将是要查看的主要代码。

标签: ruby-on-rails


【解决方案1】:

解决了,忽略了一个关键的细节,然后就解决了问题

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

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

对不起!

【讨论】:

    【解决方案2】:

    我在这段代码中遇到了类似的错误:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多