Rails为生产中的用户提供电子邮件预览

时间:2015-02-19 19:18:59

标签: ruby email ruby-on-rails-4 email-integration

上下文

像mail_view,mailcatcher,rails_email_preview等宝石似乎更加面向开发人员(一种调试模板的方式)。但我需要一些,我的rails应用程序的可信用户将在生产中使用

我的应用程序是一个项目管理应用程序,项目经理可以在其中更新项目状态,必须将电子邮件发送给项目承包商,开发人员,客户等的操作。

项目经理必须能够判断他是否想要发送电子邮件(这很容易),并且能够在一定程度上自定义消息内容(不是设计,只有特定的文本部分应该足够) 。他们希望能够控制即将发送的电子邮件,即他们需要预览他们自定义的电子邮件。为什么?

  1. 项目经理是值得信赖的用户/程序员,我让他们将HTML添加为电子邮件的自定义部分(我们谈论的是小规模的应用程序,项目经理都是值得信赖的员工)。但是关闭标签很容易被遗忘,所以我想给他们一个意思,就是检查没有错。例如。该文字并非全部显示为<h2>,因为他们忘记了结束</h2>
  2. 某些电子邮件模板已经包含了有关PM正在撰写的内容的一些信息,并且PM可能没有意识到它(理解:可能太醉了以至于无法记住它)。电子邮件预览只是一种避免重复句子的方法(例如两次Hello M. President,
  3. CSS样式应用于电子邮件。可能很难预测<h2>等标签的效果。所以我需要使用CSS呈现电子邮件
  4. 说明

    Previsualize&amp;发送按钮

    项目经理可以访问将内容提供给我的Rails应用程序的表单。我正在考虑同时提供正常的提交按钮和预可视化按钮。我可能会使用this SO question给出的一些技巧来区分2个按钮的行为

    Letter_opener:一个不错的宝石,但是独家?

    我使用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
    

2 个答案:

答案 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创建的。