如何在模型 after_create 回调中使用 simple_format 或视图来格式化 HTML

问题描述 投票:0回答:2

我正在使用 mandrill-api(来自 MailChimp)通过一次 API 调用向许多人发送电子邮件。它需要一个 HTML 参数,我希望从视图生成该参数,而不是直接在模型中生成,在模型中我无法访问 simple_format 来应用于我保存在数据库中的纯文本(self.body)。

示例代码:

class Request < ActiveRecord::Base

  after_create :attempt_send

  def attempt_send
    require 'mandrill'
    m = Mandrill::API.new
    message = {
     :subject=> "Subject",
     :html => "#{self.body}"
    }
    sending = m.messages.send(message)
    puts sending
  end

end

这种情况让我对 MVC 感到头疼。我的应用程序的其余部分使用 Rails 操作邮件程序,因此电子邮件内容可以在视图层中干净地处理。

如果您能告诉我如何以某种方式使用 simple_format ,这将是实现我在 self.body 上所需的格式的快速修复。我愿意接受更优雅的解决方案,使这个功能更像 Rails 邮件程序。我考虑过的一个选择是使用控制器方法返回电子邮件 html,但我认为这会导致自引用 http 请求,这不是一种有效的方法。开放想法!

ruby-on-rails ruby-on-rails-3 mandrill
2个回答
20
投票

您可以包含模块 ActionView::Helpers::TextHelper

http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#method-i-simple_format

class Request < ActiveRecord::Base
  include ActionView::Helpers::TextHelper

  after_create :attempt_send

  # ...
  
    :html => "#{simple_format(self.body})"

--

另一个选项不包含所有 TextHelper 方法,仅包含您需要的方法,即使用委托。

delegate :simple_format, to: 'ActionController::Base.helpers'      

0
投票

您还可以在模型中使用简单格式,如下所示

ActionController::Base.helpers.simple_format

所以你更新后的代码将变成

class Request < ActiveRecord::Base

  after_create :attempt_send

  def attempt_send
    require 'mandrill'
    m = Mandrill::API.new
    message = {
     :subject=> "Subject",
     :html => "#{ActionController::Base.helpers.simple_format(self.body)}"
    }
    sending = m.messages.send(message)
    puts sending
  end

end
© www.soinside.com 2019 - 2024. All rights reserved.