ActiveModel и ActionMailer - PullRequest
       4

ActiveModel и ActionMailer

0 голосов
/ 26 ноября 2011

Rails 3.1.2 с почтовым гемом 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'

Итак, я прочитал документы по почте, и там написано:

--- надрез ---

Все объекты, которые могут отображаться в электронном письме, имеют метод #encoded. Encoded вернет объект в виде полной строки, готовой к отправке в почтовую систему, то есть будет содержать поле заголовка и значение и CRLF в конце и завернутый по мере необходимости.

Все объекты, которые могут отображаться в электронном письме, имеют метод: decoded. Decoded вернет «значение» объекта только в виде строки. Это означает, что он не будет включать поля заголовка (например, «Кому:» или «Тема:»).

По умолчанию вызов #to_s для объекта контейнера вызовет его закодированный метод, в то время как #to_s для объекта поля вызовет его декодированный метод. Таким образом, вызов #to_s для объекта Mail вернет письмо, все закодированные готовы к отправке, а вызов #to_s для поля From или тело вернет декодированное значение объекта. Заголовок объекта Mail считается контейнером. Если вы сомневаетесь, звоните #encoded или #decoded явно, это безопаснее, если вы не уверены.

Структурированные поля, которые имеют значения параметров, которые могут быть закодированы (например, Content-Type), будут предоставлять декодированные значения параметров, когда вы вызываете имена параметров как методы для объекта.

Структурированные поля, которые имеют значения параметров, которые могут быть закодированы (например, Content-Type), будут предоставлять значения закодированных параметров при вызове имен параметров через вызов метода object.parameters [''].

--- надрез ---

Похоже, ошибка индекса - последняя отчаянная попытка Rail декодировать / кодировать? электронная почта. Единственный «индекс», который я нашел в рельсах, имеет смысл - это ActiveSupport :: Multibyte :: Chars.

Похоже, мне нужно реализовать метод кодирования / декодирования в моей ActiveModel, но я не могу понять, как!

Кто-нибудь знает, как определить ActiveModel, который работает с ActionMailer?

Ответы [ 2 ]

0 голосов
/ 28 сентября 2012

У меня была похожая ошибка из этого кода:

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

  ...
end

В этом случае он не может кодировать request.id, потому что он был числовым. Изменение на request.id.to_s решило проблему.

0 голосов
/ 26 ноября 2011

Решено, опущена важная деталь, и тут возникла проблема

Я передавал переменную экземпляра Stprod_app в почтовый вызов:

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

Извините!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...