变量内的Mailer ruby​​代码

时间:2014-07-07 13:22:26

标签: ruby-on-rails ruby-on-rails-3 html-email 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 %>

而不是看到:你好迈克尔 邮件程序显示Hello&lt;%= user.first_name%&gt;

有没有办法将变量h1的内容转换为最终值?

迈克尔

2 个答案:

答案 0 :(得分:1)

您需要将存储在数据库中的字符串评估为ruby代码(或者更准确地说,作为嵌入式ruby代码)。你可以这样做

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

这假设EmailText具有包含模板数据

的属性heading_1

然而,这可能存在安全风险。如果用户可以在电子邮件文本表中创建条目,则他们可以在您的服务器上执行任意ruby代码。我的建议是使用不同的模板系统,如小胡子,以防止这种攻击。

答案 1 :(得分:-1)

@ user变量可在account_signup.html.erb中访问,因此您可以在account_signup.html.erb中使用is

Hello <%= @user.first_name %>

它会起作用