2017-04-25 197 views
6

我有轨的背景和我的工作来实现类似的东西,如下图所示enter image description here动态内容

我的电子邮件模板都会有这样的标签英寸在发送电子邮件给客户时,他的信息将被填充到模板中。我发现这个链接here,但没有答案。我抬起头,发现this宝石,但我不能使用它,因为它使用液体模板,我无法实施它,因为时间限制。

我知道我可以做整个事情找到{{first_name}}并更换内容,每当一个标签出现,但我怀疑是否有效的方式来实现它。

请分享您的想法和指导。在此先感谢:)

回答

0

如前所述,您可以使用Liquid来替换它,或者您可以尝试使用(http://www.kuwata-lab.com/erubis/)。

另一种方法是更换标签这样的:

ERB.new(your_template.gsub("{{", "<%=").gsub("}}", "%>")).result 

你会改变变量的默认打印使用{{ }}语法。

+0

恐怕我不能这样做。这是一种非常不安全的方式,并且倾向于SQL注入。我必须用值和'某个'用户'名字'的值代替'first_name'的图像是'User.delete_all'。如果在这里被替换,我的字符串将会像'<%= User.delete_all%>'。我不认为我需要在这里说别的。我的数据库将崩溃,所有数据都消失了。 – Aakanksha

+0

噢,这会被用户使用吗?我认为它只会被你的团队使用。 – diofeher

+0

这对于最终用户准备一个模板来说是必需的,在该模板中标签将被电子邮件应该发送给的用户的数据替换。我分享了我的解决方案。欢迎提出建议。谢谢 – Aakanksha

4

当我发布了这个答案并很快就忘了它,并且upvote提醒了我这个问题,我是一个菜单noob。我成功地使其工作和分享我的解决办法,如果有人在寻找它:

class DynamicTemplateModel < ActiveRecord::Base 

    def self.parse_template(template, attrs={}) 
    result = template 
    attrs.each { |field, value| result.gsub!("{{#{field}}}", value) } 
    # remove anything that resembles a field but did not match a known field name 
    result.gsub!(/\{\{\.w+\}\}/, '') 
    return result 
    end 

end 

使用DynamicTemplate.parse_template(body, details)

其中

details = {first_name: user.first_name, last_name: user.last_name, company: user&.company&.name, email_address: user.email} 

body = "Hi {{first_name}} {{last_name}}, Your company {{company}} is registered with us successfully" 

随着方法parse_template d,新机构将如预期。

我对diofeher solution关于更换字符串的主要担心是安全性。所以用这个来管理。

希望这可以帮助别人。留下任何建议使其更好。谢谢