Почтовый рубиновый код внутри переменной

#ruby-on-rails #ruby-on-rails-3 #html-email #actionmailer

#ruby-on-rails #ruby-on-rails-3 #html-электронная почта #actionmailer

Вопрос:

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

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

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

Извините, это довольно запутанное вступление. Вот краткое изложение кода

account_mailer.rb

 class AccountMailer < ActionMailer::Base
  default from: "from@example.com"

  def account_signup(user, account, emailtext)
    @user = user
    @account = account
    @emailtext = EmailText.where(:name => "Account signup").first
    @h1 = @livetext.heading_1.html_safe
    mail :to => user.email, from: "support@mydomain.com", :subject => "Account signup"
  end

end
  

account_signup.html.erb

 <%= @h1.html_safe %>
  

Итак, если в @h1 у меня есть следующий текст

 Hello <%= user.first_name %>
  

Вместо того, чтобы увидеть: Привет, Майкл
почтовая программа отображает привет <%= user.first_name %>

Есть ли какой-либо способ преобразовать содержимое переменной h1 в конечные значения?

Майкл

Комментарии:

1. Используете ли вы user в представлении или @user ?

2. Вы говорите @h1 = @livetext.heading_1.html_safe в методе электронной почты, а затем <%= @h1.html_safe %> в представлении. разве это не вызов «html_safe» в результате вызова «html_safe» для чего-то? Кроме того, где @livetext определено?

Ответ №1:

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

  email_template = EmailText.where(:name => "Account signup").first
 @h1 = ERB.new(email_template.heading_1).result(binding)
  

Предполагается, что у EmailText есть атрибут heading_1 , который содержит данные шаблона

Однако это может представлять угрозу безопасности. Если пользователь может создавать записи в текстовой таблице электронной почты, он может выполнять произвольный ruby-код на вашем сервере. Мой совет заключался бы в использовании другой системы шаблонов, такой как mustache, для защиты от такой атаки.

Комментарии:

1. Eval — слишком мощное средство для этого. Я почти уверен, что это можно решить, вызвав render правильный объект с правильными параметрами.

2. Я не уверен, как это сделать, когда вы указываете шаблон в виде строки. В любом случае это не имеет значения, потому что ERB всегда оценивает строки как ruby-код.

3. Вы тестировали этот код? У меня есть подозрение, что это не сработает 🙂

4. Вы правы, я допустил ошибку. Отредактирован в соответствии с тем, что я пробовал в rails console

5. @email_text = ERB.new(email_template).result(binding) . И нет eval 🙂

Ответ №2:

переменная @user доступна в account_signup.html.erb, поэтому вы можете использовать ее в account_signup.html.erb

 Hello <%= @user.first_name %>
  

Это будет работать

Комментарии:

1. Вы не поняли вопрос.