Rails: Пользовательский шаблон для электронной почты "метод доставки"? - PullRequest
0 голосов
/ 16 июня 2010

Я создаю систему электронной почты, которая хранит мои разные электронные письма в базе данных и вызывает соответствующий метод "delivery_" через method_missing (поскольку я не могу явно объявить методы, поскольку они генерируются пользователем).

Моя проблема в том, что мое приложение rails по-прежнему пытается отобразить шаблон для любого сгенерированного электронного письма, хотя эти шаблоны не существуют.Я хочу заставить все электронные письма использовать один и тот же шаблон (views/test_email.html.haml), который будет настроен для извлечения их форматирования из записей моей базы данных.

Как мне это сделать?Я попытался добавить render :template => 'test_email' в методе test_email в emailer_controller безуспешно.


models/emailer.rb:

class Emailer < ActionMailer::Base

  def method_missing(method, *args)
    # not been implemented yet
    logger.info "method missing was called!!"
  end

end

controller/emailer_controller.rb:

class EmailerController < ApplicationController

  def test_email
    @email = Email.find(params[:id])
    Emailer.send("deliver_#{@email.name}")
  end

end

views/emails/index.html.haml:

%h1 Listing emails
%table{ :cellspacing => 0 }
  %tr
    %th Name
    %th Subject
  - @emails.each do |email| 
    %tr
      %td=h email.name
      %td=h email.subject
      %td= link_to 'Show', email
      %td= link_to 'Edit', edit_email_path(email)
      %td= link_to 'Send Test Message', :controller => 'emailer', :action => 'test_email', :params => { :id => email.id }
      %td= link_to 'Destroy', email, :confirm => 'Are you sure?', :method => :delete
%p= link_to 'New email', new_email_path

Я получаю сообщение об ошибке:

Шаблон отсутствует

Отсутствует шаблон emailer / name_of_email_in_database.erb в пути просмотра приложения / views

Ответы [ 3 ]

0 голосов
/ 16 июня 2010

Аф, я чувствую себя глупо.Я понял это:

models/emailer.rb:

class Emailer < ActionMailer::Base

  def method_missing(method, *args)
    logger.info "method missing was called!!"
    recipients  "Test <test@test.com>" 
    body        "#{ Email.find_by_name(method.to_s).body }"
  end

end

Поскольку входящий method в основном является именем записи, я могу напрямую извлечь содержимое тела, хранящееся в базе данныхпередать это как тело письма, минуя шаблоны в целом.

0 голосов
/ 16 июня 2010

Я бы пошел «на уровень»

Другими словами, используйте тот же вид для электронной почты каждого.Но в представлении визуализируйте различный текст в зависимости от user_id.

Помните, что представление может вызывать метод визуализации.

В моем случае я позволил пользователям загружать шаблоны электронной почты с использованием системы жидких шаблонов.,(Google для рельсовых жидких шаблонов.) Использование жидкости хорошо, так как это безопасно - пользователи не могут включать произвольный код ruby ​​в свои шаблоны.

Тогда мое представление электронной почты отображает жидкий шаблон, и таким образом настраиваемая электронная почта становитсягенерироваться.

0 голосов
/ 16 июня 2010

Попробуйте multipart, возможно, это работает

  def test_email
    @email = Email.find(params[:id])
    Emailer.send("deliver_#{@email.name}")
    part :content_type => 'multipart/alternative' do |copy|
      copy.part :content_type => 'text/plain' do |plain|
        plain.body = render( :file => "conta.text.plain.erb",  :email=>@email )
      end
      copy.part :content_type => 'text/html' do |html|
        html.body = render( :file => "conta.text.html.erb",  :email => @email )
      end
    end
  end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...