【问题标题】:How do I render_to_string in a rails model?如何在 rails 模型中 render_to_string?
【发布时间】:2011-12-03 18:49:32
【问题描述】:

我如何在 rails 的模型中render_to_string

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

我的模型是邮寄者。只是不是电子邮件、传真。

【问题讨论】:

  • Ruby 的 to_s 方法怎么样(几乎适用于任何东西)
  • 查看?我以为你说的是​​模特?你可能需要发布一些伪代码,你现在已经失去了我:)
  • 我想从模型渲染视图。

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


【解决方案1】:

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

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

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

Faxer 概念的好处在于,它可以抽象出更多内容,而不仅仅是简单地呈现,包括调度、排队和保证交付等内容。

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

【讨论】:

    【解决方案2】:

    这是工作代码:

    # 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 上测试。请注意,我没有找到这个想法,只是将它包装在一个方便的方法中。

    当然,不要因此认为我提倡在模型中渲染视图 ;-)

    【讨论】:

    • 注意 Rails 3 使用 ActionView::Base.new(Rails.root.join('app', 'views'))
    • 你怎么称呼这个?例如,如果模板是“app/views/foo.html.erb”,你是把那个文件名传递给它,还是先读它?
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-22
      • 2011-09-18
      • 2011-08-27
      • 2022-06-16
      • 2015-09-12
      • 2018-06-04
      • 1970-01-01
      • 2011-07-24
      • 1970-01-01
      相关资源
      最近更新 更多