2010-01-07 2 views
29

Я хотел бы отправлять электронные письма из таблицы каждую ночь в полночь, поэтому я создал модель для отслеживания всех отправляемых сообщений. Эта модель Communication хранит, с которой письмо отправляется, из и содержание письма, отправляемого как html. Пользователь вводит критерии для соответствия, для которых предназначен письмо: состояние, страна, любимый цвет и т. Д., Который возвращает список допустимых совпадений.Рендеринг представления Rails для строки для электронной почты

Этот список допустимых совпадений повторяется и создается новое сообщение для каждого. Как сделать содержимое частичного представления строкой для хранения в базе данных для доставки в полночь.

@communication = Communication.new(params[:communication]) 
@communication.body = //Render Partial with local variables to string here 

8 января 2010: Я реализовал решение, предложенное нейтрино, и мой код выглядит следующим образом:

@communication.message_body = render_to_string(
    :partial => "letters/small_letter", 
    :locals => { :quote => @quote}) 

Недостаток такого подхода состоит в том, что она требует контекст, поэтому он должен отображаться внутри контроллера, это исключает создание электронной почты с использованием файла рейка. Как указывали другие, подход использования модели связи может ввести некоторую ненужную сложность. В это время, поскольку условия, которые я использую для создания списка получателей, никогда не сохраняются, я решил продолжить использовать модель связи.

ответ

39

Как (почти) всегда в Rails, есть метод, который: ActionController::Base#render_to_string

В Rails 3, этот метод был перенесен на AbstractController::Rendering#render_to_string.

+0

Для этого требуется наличие активного контекста представления, насколько я знаю, и, кроме всего прочего, не работает для задач рейка. – tadman

+0

Я передаю частичное из контроллера связи, и поэтому у меня есть контекст. Это решение прекрасно работает, спасибо. – nixterrimus

+2

выглядит так, как метод устарел – avioing

-1

Вы попробовали action mailer? Он получит ваши просмотренные представления и обеспечит поддержку активной записи.

11

Вы можете посмотреть на методы, чтобы сделать шаблон вне контроллера, такие как:

http://geek.swombat.com/rails-rendering-templates-outside-of-a-contro

Это, как говорится, это, вероятно, лучше использовать встроенную отправку сообщений электронной почты класса ActionMailer :: Base, которая может отображать шаблоны для вас. Сохранение параметров в вашей модели связи, вероятно, лучше, чем сохранение развернутого HTML, поскольку эти параметры могут быть сериализованы, а затем перенаправлены на вызов типа «send_X_notification».

Они могут быть построены с использованием генератора:

script/generate mailer communications_mailer 
+0

Да, это лучший ответ –

+0

Спасибо, это отлично выглядит.Моя мысль с моделью связи заключалась в том, что мне было бы легче создать большое количество писем, которые нужно отправить, а затем ждать, чтобы отправить их до определенного времени, например, в полночь. Имеет ли смысл использовать как мою модель общения, так и Action Mailer? – nixterrimus

+0

+1 для использования ActionMailer для отправки по электронной почте! Возможно, вам стоит взглянуть на фоновый контроль работы, если вы планируете делать асинхронно, например delayed_job. – jamuraa

5

вы могли бы попробовать это (в консоли рельсы):

class StaticRender < ActionController::Base 
    def self.render_erb(template_path, params) 
     view = ActionView::Base.new(ActionController::Base.view_paths, {}) 
     class << view 
     include ApplicationHelper 
     end 
     view.render(:file => "#{template_path}.html.haml", :locals => params, :layout => false) 
    end 
    end 


StaticRender.render_erb("home", {}) 

вы должны иметь вид «дом» для этого .. ..