2017-08-24 61 views
0

使用与电子商务网站连接的Rails应用程序,偶尔会将我们的应用程序发送的电子邮件发送给我们使用的电子商务网站的客户。如何让用户在Rails中提交自定义电子邮件模板?

现在我们有一个通用的电子邮件模板保存在应用程序中作为html.erb文件,但我们正在尝试添加功能以允许这些电子商务网站(我们的用户)提交他们自己的自定义电子邮件模板顾客。

我的第一个直觉是允许用户以textarea格式提交他们的模板并将其保存在我们的MySQL数据库中的模板表中。不过,我关心的几件事情:

  1. 模板需要访问实例变量,这意味着我们需要ERB,HAML,或一些其他的格式与视图中的Rails的实例变量兼容。
  2. 这个过程如何才能正常工作?我会带着一个充满HTML标签,内容和CSS样式标签的textarea - 然后需要将它转换成一个巨大的字符串以保存在表格中。如何将原始HTML转换为字符串,然后转换回HTML以动作呈现视图并发送邮件?
  3. 是否有宝石或其他做法来防止将所有不需要的erb或Ruby代码提交到用户的自定义模板中?我最担心的是一个用户提交了一个模板<% User.destroy_all %>或其他破坏性的Ruby代码。
  4. 有什么更容易的方法来实现这个过程比我在想什么?数据库路线是我第一次想到的,但现在我认为只需让我们的用户直接向我们提交自己的自定义模板并直接将它们保存在应用程序中可能会更好。但是,当然,这需要用户在他们想要对其进行更改时重新提交模板。

我们的应用程序使用Rails 4.1.7和Ruby 2.1.4p265。

回答

0

您可能会采取的一种方法是允许用户将mjml template保存到数据库。

Theres a mjml-rails宝石,可能有所帮助。

有一个mjml-include标记,它允许您在呈现之前包含thigns。我想你可以给你的用户一个允许的包含列表,哪个链接到正确的部分。

+0

谢谢!我会研究这个。 –

1

按照您的要求,我会用一个简单的解决方案

  • 去允许用户保存在数据库中的一个基本的HTML或降价模板,让他们知道如何告诉他们哪些变量来构建它自己必须使用或可以使用。
  • 创建一个解析器类,该解析器类解析html输入并生成一个有效的.erb文件。

我会离开的实施给你,但这里是例如输入:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>[[title]]</title> 
</head> 
<body> 
    Hello [[username]], thank you for subscribing. 

    You can get started by visiting this <a href="[[link]]">link</a>. 
</body> 
</html> 

解析器转换[[username]]<%= @username %>,结果会是这样的:

<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title><%= @title %></title> 
</head> 
<body> 
    Hello <%= @username %>, thank you for subscribing. 

    You can get started by visiting this <a href="<%= @link %>">link</a>. 
</body> 
</html> 

回答您的问题:

1.上面已经回答了这个问题。
2.这很简单,使用.html_safe或raw()辅助函数。
3.这不应该是一个问题,因为你不会运行任何由用户提交的代码,因为你只允许用户给你知道的设置变量。你只是做一个正则表达式匹配而不是eval()。
4.这是我能想到的最简单的解决方案。

+0

谢谢!我有一个类似于昨晚的想法,允许用户输入标签来表示数据,然后解析字符串并用后端中的erb替换。因为我们已经决定利用我们现有模板中的css,并且只需允许我们的用户自定义正文中的文本并添加简单的粗体/斜体,就可能实际上走这条路线。 –

相关问题