#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. Вы не поняли вопрос.