【问题标题】:Rendering a Rails view to string for email将 Rails 视图呈现为电子邮件字符串
【发布时间】:2012-06-21 07:24:37
【问题描述】:

我想在每晚午夜从一张桌子发送电子邮件,因此我创建了一个模型来跟踪所有要发送的通信。这个Communication 模型存储了信件的收件人、发件人以及要以html 格式发送的信件内容。用户输入一个标准来匹配这封信的目标对象:州、国家、最喜欢的颜色等等,这会返回一个可接受的匹配项列表。

这个可接受的匹配列表被迭代,并为每个生成一个新的通信。如何将部分视图的内容呈现为字符串以存储在数据库中以便在午夜交付。

@communication = Communication.new(params[:communication])
@communication.body = //Render Partial with local variables to string here

2010 年 1 月 8 日:我已经实现了 neutrino 提出的解决方案,我的代码如下所示:

@communication.message_body = render_to_string(
  :partial => "letters/small_letter", 
  :locals => { :quote => @quote})

这种方法的缺点是它需要一个上下文,因此它必须在控制器中呈现,这排除了使用 rake 文件生成电子邮件的可能性。正如其他人指出的那样,使用通信模型的方法可能会引入一些不必要的复杂性。目前,由于我用于生成收件人列表的条件从未存储过,因此我选择继续使用通信模型。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    就像(几乎)在 Rails 中一样,有一种方法可以做到这一点:ActionController::Base#render_to_string

    在 Rails 3 中,此方法已移至 AbstractController::Rendering#render_to_string

    【讨论】:

    • 据我所知,这需要一个活动视图上下文,并且不适用于 rake 任务等。
    • 我正在从通信控制器渲染部分,因此我有一个上下文。这个解决方案效果很好,谢谢。
    • 看起来该方法已被弃用
    • @avioing ActionController::Base 中的那个已被弃用,但他们实际上只是将其移至AbstractController::Rendering
    【解决方案2】:

    您可能希望了解在控制器之外呈现模板的技术,例如:

    http://geek.swombat.com/rails-rendering-templates-outside-of-a-contro

    话虽如此,使用内置的电子邮件发送类 ActionMailer::Base 可能会更好,它可以为您呈现模板。将参数存储在您的通信模型中可能比存储展开的 HTML 更好,因为这些参数可以序列化,然后再推回“send_X_notification”类型调用。

    这些可以使用生成器构建:

    script/generate mailer communications_mailer
    

    【讨论】:

    • 谢谢,这看起来很棒。我对通信模型的想法是,我可以轻松地创建大量需要发送的电子邮件,然后等到指定时间(例如午夜)再发送它们。同时使用我的通信模型和 Action Mailer 是否有意义?
    • +1 用于使用 ActionMailer 发送电子邮件!如果您计划异步执行操作,则可能需要研究后台作业控制,例如延迟作业
    • 使用模型来中间发送电子邮件并没有错。事实上,在某些情况下它实际上效率更高,因为您只需要迭代一些简单的模型,而不是可能要大得多的原始集合。不过,我会评估一下,与直接使用通知程序发送消息相比,通信模型的额外复杂性是否值得麻烦。
    • 谢谢你的想法,塔德曼。由于我用于查找向其发送通信的人群的条件从未被存储,因此我认为在这种情况下,生成完整的信件然后再发送它会更有效,而不必费心如何找到收件人。我很欣赏你的观点和它给我的信心,我在做正确的事。
    【解决方案3】:

    你可以试试这个(在 Rails 控制台中):

      class StaticRender < ActionController::Base
        def self.render_erb(template_path, params)
          view = ActionView::Base.new(ActionController::Base.view_paths, {})
          class << view
            include ApplicationHelper
          end
          view.render(:file => "#{template_path}.html.haml", :locals => params, :layout => false)
        end
      end
    
    
     StaticRender.render_erb("home", {})
    

    您需要为此拥有“家”视图....

    【讨论】:

      【解决方案4】:

      你试过action mailer吗?它将呈现您的视图并提供活动记录支持。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 2011-06-23
        • 1970-01-01
        • 1970-01-01
        • 2016-10-10
        相关资源
        最近更新 更多