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?