如何在rails模型中render_to_string?

时间:2011-10-09 00:54:44

标签: ruby-on-rails ruby ruby-on-rails-3 model-view-controller

如何在导轨模型中render_to_string

如果你这样说,“你永远不应该从模型中渲染任何东西。任何渲染 - 根本就是控制器和视图的责任。”听我说,或建议一个更好的方法来解决问题

我的模特是邮寄者。只是没有电子邮件,传真。

3 个答案:

答案 0 :(得分:3)

如果您正在寻找一个优雅的解决方案,也许您可​​以实现一个ActionFaxer :: Base。您可以关注ActionMailer::Base的实施,但专门用于传真。采用这种方法应该可以访问render_to_string。

值得注意的是,在这种情况下,您不会将render_to_string添加到模型中,而是引入传真器的概念,它将处理模型。

如果您只需要在模型中渲染模板的任意支持,您可以直接针对erb或其他模板语言实现进行编码。

传真概念的优点在于它可以抽象出更多,然后简单地渲染包括调度,排队和保证交付等内容。

如果你成功了,也许当你完成后,你可以把它变成一颗宝石。

答案 1 :(得分:3)

这是工作代码:

# instance_vars must follow the '@name' convention.
#
def render_template( template_content, options={} )
  local_vars    = options[ :local_vars    ] || {}
  instance_vars = options[ :instance_vars ] || {}

  view = ActionView::Base.new( Rails::Configuration.new.view_path )

  instance_vars.each do | name, value |
    view.instance_variable_set( name, value )
  end

  rendering_options = {
      :inline => template_content,
      :type   => :builder,
      :locals => local_vars
  }

  view.render( rendering_options )
end

在Rails 2.3.14上测试。请注意,我没有找到这个想法,只是用方便的方法包装它。

当然,不要因为这个而假设我提倡在模型中进行视图渲染; - )

答案 2 :(得分:0)

如果你发现这个并希望在Rails 3上做到这一点,那么这个要点是一个很大的帮助:

https://gist.github.com/aliang/1022384