edit: понял, макеты следуют схеме именования, отличной от шаблонов электронной почты. Просто переименуйте их следующим образом:
layout.text.html.erb => layout.html.erb
layout.text.plain.erb => layout.text.erb
Я также допустил ошибку при определении частей вручную, если вы используете это:
part :content_type => 'text/plain',
:body => render_message('my_template')
Тогда Rails не может определить content_type для вашей части и предполагает, что это HTML.
После того, как я изменил эти две вещи, это сработало для меня!
следует оригинальный ответ ..
В прошлом я много раз сталкивался с этим вопросом, обычно заканчивая каким-то не сухим быстрым и грязным раствором. Я всегда думал, что я единственный, кто столкнулся с этой проблемой, потому что Google не нашел ничего полезного по этому вопросу.
На этот раз я решил покопаться в Rails, чтобы выяснить это, но пока без особого успеха, но, возможно, мои выводы помогут кому-то еще понять это.
Я обнаружил, что в ActionMailer :: Base методу #render_message поручено определить правильный content_type и назначить его @current_template_content_type. #default_template_format затем либо возвращает правильный тип MIME для макета, либо, если @current_template_content_type не установлен, по умолчанию он будет: html.
Вот как ActionMailer :: Base # render_message выглядит в моем приложении (2.3.5)
def render_message(method_name, body)
if method_name.respond_to?(:content_type)
@current_template_content_type = method_name.content_type
end
render :file => method_name, :body => body
ensure
@current_template_content_type = nil
end
Беда в том, что method_name представляется строкой (имя локального представления, в моем случае «new_password.text.html»), и строки, конечно, не answer_to #content_type, что означает, что @current_template_content_type всегда будет оставаться нулевым, и поэтому #default_template_format всегда будет по умолчанию: html.
Не намного ближе к реальному решению, я знаю. Внутренние элементы ActionMailer слишком непрозрачны для меня.