У меня была такая же проблема. Я построил дисплей с соответствующей моделью, которую я отправлял, а не в почтовой программе. Я был в состоянии предоставить пример данных или данные в реальном времени, чтобы отобразить их пользователю.
когда пришло время на самом деле отправить его, я сделал то же самое в представлении почтовой программы
EDIT:
Я заранее прошу прощения за имена переменных дерьма. Я не уверен, что мне разрешено явно говорить о них:)
Допустим, у меня есть функция BarMailer с именем foo (status, bar)
где статус - это тестовое электронное письмо или действующее электронное письмо, а бар - моя связанная модель.
Я позвонил в delivery_foo ("test", bar)
delivery_foo отправляет многокомпонентное сообщение, поэтому для каждой части я выполняю render_message и передаю нужные мне переменные. например:
p.body = render_message('bar_html', :bar => bar, :other_data => bar.other_data)
так, что render_message говорит, что специально использует представление bar_html (у меня также есть bar_text для простого текста).
это содержимое моего представления bar_html:
<%=render :inline => @bar.some_parent.some_other_model.html, :locals => {:other_data => @other_data, :time => Time.now, :bar => @bar }%>
Это немного сложно, но оно основано на системе шаблонов. Благодаря повсеместному рендерингу я могу использовать один и тот же код для ряда различных функций, включая предварительный просмотр и отправку. Мне нравится это, потому что это становится WYSIWIG. Никакого дополнительного кода или функциональности, которые могли бы быть ошибочными и испортить потенциальный вывод в электронном письме. Если он работает в одной области, он будет работать в другой. К тому же, сохраняя его СУХОЕ, я не забуду изменить копию (что я часто делал, хе-хе).