像mail_view,mailcatcher,rails_email_preview等宝石似乎更加面向开发人员(一种调试模板的方式)。但我需要一些,我的rails应用程序的可信用户将在生产中使用。
我的应用程序是一个项目管理应用程序,项目经理可以在其中更新项目状态,必须将电子邮件发送给项目承包商,开发人员,客户等的操作。
项目经理必须能够判断他是否想要发送电子邮件(这很容易),并且能够在一定程度上自定义消息内容(不是设计,只有特定的文本部分应该足够) 。他们希望能够控制即将发送的电子邮件,即他们需要预览他们自定义的电子邮件。为什么?
<h2>
,因为他们忘记了结束</h2>
Hello M. President,
)<h2>
等标签的效果。所以我需要使用CSS呈现电子邮件 项目经理可以访问将内容提供给我的Rails应用程序的表单。我正在考虑同时提供正常的提交按钮和预可视化按钮。我可能会使用this SO question给出的一些技巧来区分2个按钮的行为
我使用letter_opener进行调试(因此不同的上下文),但这通常是我想向项目经理展示的预览。但是,为了使用,letter_opener需要修改action_mailer配置config.action_mailer.delivery_method = :sendmail # (or :letter_opener)
。所以我只能预览电子邮件,或者将它们发送给真实的,而不是两者兼而有之?我会接受一个解决方案,让我选择是使用letter_opener还是发送真实的电子邮件
而不是盲目地信任我的项目经理&#39;能够在不忘记结束标记的情况下编写基本的html,也许你可以推荐一个能够显示我f.text_area()
内容的漂亮的WYSIWYG编辑器?
这将是一个奖励,而不是我的问题的实际答案
我现在知道不同的电子邮件客户端可以以不同方式呈现电子邮件客户端。我现在暂时不理睬这个。因此,预览的呈现方式并不重要。我喜欢letter_opener
的渲染
查看&gt;控制器&gt;邮寄者
my_email_view.html.erb
<%= form_tag some_mailing_list_path %>
<%= fields_for :email do |f| %>
<!-- f.text_field(:subject, ....), etc -->
<% end %>
<%= submit_tag("Send email") %>
<%= submit_tag("Preview") %>
<% end %>
my_controller.rb
before_action :prep_email # Strong parameters, define @mail with form contents
# Handles the POST
def some_action
check(:to, :from, :subject) # I check the parameters in private functions
if email_alright? # Above checks will raise a flag if something went wrong
if Rails.env.production?
MailingListsMailer.my_action(@mail).deliver_later
else
MailingListsMailer.my_action(@mail).deliver_now
end
flash.notice = "Email sent"
redirect_to :back
else
redirect_to :back
end
end
mailing_list_mailer.rb
def my_action(message)
format_mail_params(message) # Will set more variables
@etude = etude
@include_reference = message[:include_reference]
@include_description = message[:include_description]
dst = Proc.new { read_emails_file }
mail(
to: dst,
from: message[:from],
subject: @subject_full)
end
答案 0 :(得分:1)
问题更新:根据您的伪代码,这是创建状态更新模型并通过电子邮件将更新通过电子邮件发送到邮件列表的简单案例。
有几种方法可以解决这个问题,但我建议您保持简单并避免使用宝石。
<%= link_to "New update", new_status_update_path, class: 'button' %>
模型
class StatusUpdate
belongs_to :sender, class_name: 'User'
belongs_to :mailing_list
end
控制器
class StatusUpdateController
def new
@status_update = StatusUpdate.new
end
def create
@status_update = StatusUpdate.create(status_update_params)
@status_update.mailing_list = MailingList.where(whichever_mailing_list)
if @status_update.save
redirect_to :action => "preview", :status_update => @status_update
end
end
def preview
@status_update = StatusUpdate.where(id: params[:id]).first
@mailing_list = MailingList.where(id: @status_update.mailing_list_id)
end
def send
@status_update = StatusUpdate.where(id:params[:status_update_id]).first
Mailer.status_update_email(@status_update).deliver
end
end
status_updates的/ new.html.erb
<%= simple_form_for(@status_update) do |f| %>
<%= f.input :title %>
<%= f.input :content, as: :text %>
<%= f.button :submit, 'Post update' %>
<% end %>
status_updates的/ preview.html.erb
<h1>Preview</h1>
<%= simple_form_for(@status_update, :url => url_for(:controller => 'StatusUpdateController, :action => 'send') do |f| %>
<%= f.input :subject %>
<div class="email-render-container">
<%= @status_update.content %>
</div>
<p>Make changes</p>
<%= f.input :content, as: :text %>
<%= f.button :submit, 'Approve and send emails' %>
<% end %>
如果我是你,我将取消预览功能。如果你是 从模板加载内容以及您所担心的所有内容 潜在的重复内容,只需这样做:
控制器
class StatusUpdateController
def new
@status_update = StatusUpdate.new
template = UpdateTemplate.where(however_you_assign_the_template)
@status_update.content = template.content
end
def create
@status_update = StatusUpdate.create(status_update_params)
@status_update.mailing_list = MailingList.where(whichever_mailing_list)
if @status_update.save
Mailer.status_update_email(@status_update).deliver
end
end
end
并使用css设置新状态更新表单的样式,以模拟在实际电子邮件模板上的书写。您可以节省用户和自己很多时间。
所见即所得编辑
永远不要相信最终用户能够编写html。根据您的需求,我发现https://www.froala.com/wysiwyg-editor易于部署。
区分按钮
只需使用带有标签的预览图标和/或按钮下方的字幕即可区分按钮。在您的视图中,您不需要太多的命令逻辑。
或者,如果您认为预览对最终用户很重要,只需使用&#34;预览&#34;按钮作为下一个逻辑步骤,而不是向用户显示太多不必要的选择。
<强>建议强>
采用像Angularjs这样的前端框架使得这种用例几乎非常简单,但如果您不熟悉它,它可能会过度使用并伴随着陡峭的学习曲线。
答案 1 :(得分:0)
看一下letter_opener gem。它是由Railscasts家伙Ryan Bates创建的。