Ruby on rails 将Rails视图呈现为电子邮件的字符串

Ruby on rails 将Rails视图呈现为电子邮件的字符串,ruby-on-rails,Ruby On Rails,我想每晚午夜从桌子上发送电子邮件,所以我创建了一个模型来跟踪所有要发送的通信。此通信模型以html格式存储信件的收件人、发件人和内容。用户输入一个标准以匹配字母的目标对象:州、国家、最喜爱的颜色等,从而返回可接受匹配的列表 此可接受匹配列表将被迭代,并为每个匹配生成新的通信。如何将部分视图的内容呈现为字符串,以存储在数据库中,以便在午夜交付 @communication = Communication.new(params[:communication]) @communication.body

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

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

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

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

@communication.message_body = render_to_string(
  :partial => "letters/small_letter", 
  :locals => { :quote => @quote})
这种方法的缺点是它需要一个上下文,因此必须在控制器中呈现,这就排除了使用rake文件生成电子邮件的可能性。正如其他人指出的那样,使用通信模型的方法可能会引入一些不必要的复杂性。此时,由于我用于生成收件人列表的条件从未存储,我选择继续使用通信模型。

正如(几乎)总是在Rails中一样,有一种方法:


在Rails 3中,此方法被移动到。

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

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

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

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

script/generate mailer communications_mailer
您可以尝试(在rails控制台中):

class StaticRenderparams,:layout=>false)
结束
结束
StaticRender.render_erb(“home”,{})

您需要有视图“home”来实现这一点……

据我所知,这需要有一个活动的视图上下文,并且不适用于rake任务等。我正在从通信控制器渲染部分,因此我有一个上下文。这个解决方案非常有效,谢谢。看起来方法是deprecated@avioing
ActionController::Base
中的一个已被弃用,但他们实际上只是将其移动到了
AbstractController::Rendering
。谢谢,这看起来很棒。我对通信模型的想法是,它可以让我轻松地创建大量需要发送的电子邮件,然后等到指定的时间(如午夜)再发送。同时使用我的沟通模式和ActionMailer有意义吗?+1用于使用ActionMailer发送电子邮件!如果您计划异步执行操作,那么您可能需要研究后台作业控制,例如延迟作业。使用模型来中间发送电子邮件没有什么错。事实上,在某些情况下,它实际上效率更高,因为您只需要迭代一些简单的模型,而不需要迭代可能要大得多的原始集。不过,我会评估,与直接使用通知程序发送消息相比,通信模型的额外复杂性是否值得麻烦。谢谢你的想法,塔德曼。由于我用于查找要向其发送通信的组的条件从未被存储,因此我认为在这种情况下,生成完整的信函然后稍后发送比不必担心如何查找收件人更有效。我很欣赏你的观点和它给我的信心,我正在做正确的事情。
  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", {})