允许用户在 Rails 中为 ActionMailer 创建自定义电子邮件模板
Allow user to create custom email template for ActionMailer in Rails
我想让 rails 应用程序的用户通过表单创建自己的电子邮件模板,并将其用作将发送邮件的网站标准电子邮件模板表单,但我找不到任何教程,它还需要包含几个动态变量。
有明确的方法吗?
( 因此用户将在引用变量的表单中输入电子邮件文本
将在发送前进行评估)
最简单的方法是将它存储到您的 rails 数据库中。所以你应该创建一个名为 EmailTemplate
的 rails 模型,它有一个字段 body
类型 text
.
接下来创建表单以更新或创建新模板。
使用此特定模板并将其作为电子邮件发送。创建一个 Rails 邮件程序,并在视图中加载相应的 EmailTemplate。所以在视图中它将如下所示。
<%= EmailTemplate.find(id).body.html_safe %>
以上方法是最简单的方法。如果您还想让用户访问您系统中的各种变量,那么我建议您查看流动标记语言 (https://github.com/Shopify/liquid/)。
您可以通过多种方式实现它。这是一种方法。
首先,您需要将用户生成的电子邮件模板存储在数据库中。
CustomEmailTemplate.create(user_id: params[:user_id], template_body: params[:template_body])
当需要为模板发送电子邮件时,您可以执行如下操作:
custom_values = { name: "Whatever", value: "nice" }
template = CustomEmailTemplate.find(template_id)
CustomerEmailer.send_email(template, custom_values).deliver
要使其真正起作用,您需要在邮件程序中执行如下操作:
def send_email(template, custom_values)
@template = template
@custom_values = custom_values
mail subject: "Your subject goes here.."
end
在 send_email.html.erb 中,执行如下操作:
<%= @template.template_text.gsub(/@@name@@/, @custom_values[:name]).gsub(/@@value@@/, @custom_values[:value]) %>
您看到模板包含“@@name@@”和“@@value@@”。这些是您可以用自定义值替换的标记。
当然,你可以重构这段代码,将替换逻辑放入模型等中,使其成为"clean code"。
希望对您有所帮助。
我会修改 Yosep 的想法以避免使用实际的 erb 模板。使用 body
arg 直接发送邮件,因为它的性能开销较小。
例如
def send_email(template, custom_values)
body = template.template_text\
.gsub(/@@name@@/, custom_values[:name])
.gsub(/@@value@@/, custom_values[:value]
mail subject: "Your subject goes here..", body: body
end
您可以使用 panaromic gem 将视图存储在数据库中。这将允许 Rails 根据 path
列和 handler
自动搜索数据库中的关联视图。
要通过 UI 访问变量,可以使用液体模板。 liquid-rails 提供了一种将液体模板用作 Rails 视图的方法。现在,如果您将 handler
列更新为 .liquid,您可以将视图作为液体模板存储在数据库中。
- 添加模型
class NotificationTemplate < ApplicationRecord
store_templates
end
- 创建模板
NotificationTemplate.create(
id: 1,
body: "<p>Hi {{user_name}}, Thanks for your feedback</p>",
path: "feedback_response_mailer/send_response_mail",
locale: nil,
handler: "liquid",
partial: false,
format: "html"
}
- 添加使用
liquid
的邮件程序
class FeedbackResponseMailer < ApplicationMailer
prepend_view_path NotificationTemplate.resolver
def send_response_mail
@user = User.find(params[:user_id])
mail(to: @user.email, subject: 'Thank you')
end
def liquid_assigns
{ 'user_name' => @user.name }
end
end
我想让 rails 应用程序的用户通过表单创建自己的电子邮件模板,并将其用作将发送邮件的网站标准电子邮件模板表单,但我找不到任何教程,它还需要包含几个动态变量。
有明确的方法吗?
( 因此用户将在引用变量的表单中输入电子邮件文本 将在发送前进行评估)
最简单的方法是将它存储到您的 rails 数据库中。所以你应该创建一个名为 EmailTemplate
的 rails 模型,它有一个字段 body
类型 text
.
接下来创建表单以更新或创建新模板。
使用此特定模板并将其作为电子邮件发送。创建一个 Rails 邮件程序,并在视图中加载相应的 EmailTemplate。所以在视图中它将如下所示。
<%= EmailTemplate.find(id).body.html_safe %>
以上方法是最简单的方法。如果您还想让用户访问您系统中的各种变量,那么我建议您查看流动标记语言 (https://github.com/Shopify/liquid/)。
您可以通过多种方式实现它。这是一种方法。
首先,您需要将用户生成的电子邮件模板存储在数据库中。
CustomEmailTemplate.create(user_id: params[:user_id], template_body: params[:template_body])
当需要为模板发送电子邮件时,您可以执行如下操作:
custom_values = { name: "Whatever", value: "nice" }
template = CustomEmailTemplate.find(template_id)
CustomerEmailer.send_email(template, custom_values).deliver
要使其真正起作用,您需要在邮件程序中执行如下操作:
def send_email(template, custom_values)
@template = template
@custom_values = custom_values
mail subject: "Your subject goes here.."
end
在 send_email.html.erb 中,执行如下操作:
<%= @template.template_text.gsub(/@@name@@/, @custom_values[:name]).gsub(/@@value@@/, @custom_values[:value]) %>
您看到模板包含“@@name@@”和“@@value@@”。这些是您可以用自定义值替换的标记。
当然,你可以重构这段代码,将替换逻辑放入模型等中,使其成为"clean code"。
希望对您有所帮助。
我会修改 Yosep 的想法以避免使用实际的 erb 模板。使用 body
arg 直接发送邮件,因为它的性能开销较小。
例如
def send_email(template, custom_values)
body = template.template_text\
.gsub(/@@name@@/, custom_values[:name])
.gsub(/@@value@@/, custom_values[:value]
mail subject: "Your subject goes here..", body: body
end
您可以使用 panaromic gem 将视图存储在数据库中。这将允许 Rails 根据 path
列和 handler
自动搜索数据库中的关联视图。
要通过 UI 访问变量,可以使用液体模板。 liquid-rails 提供了一种将液体模板用作 Rails 视图的方法。现在,如果您将 handler
列更新为 .liquid,您可以将视图作为液体模板存储在数据库中。
- 添加模型
class NotificationTemplate < ApplicationRecord
store_templates
end
- 创建模板
NotificationTemplate.create(
id: 1,
body: "<p>Hi {{user_name}}, Thanks for your feedback</p>",
path: "feedback_response_mailer/send_response_mail",
locale: nil,
handler: "liquid",
partial: false,
format: "html"
}
- 添加使用
liquid
的邮件程序
class FeedbackResponseMailer < ApplicationMailer
prepend_view_path NotificationTemplate.resolver
def send_response_mail
@user = User.find(params[:user_id])
mail(to: @user.email, subject: 'Thank you')
end
def liquid_assigns
{ 'user_name' => @user.name }
end
end