如何将erb模板渲染为字符串内部动作?

Fen*_*Wan 14 ruby-on-rails ruby-on-rails-3

我需要一串html(类似的东西"<html><body>Hello World</body></html>")用于传真.

我把它写进一个seprate ERB文件:views/orders/_fax.html.erb,并尝试呈现在行动再培训局:html_data = render(:partial => 'fax').

以下是引发问题的控制器的一部分:

  respond_to do |format|
      if @order.save   
        html_data = render(:partial => 'fax')
        response = fax_machine.send_fax(html_data)
        ......

        format.html { redirect_to @order, notice: 'Order was successfully created.' }
        format.json { render json: @order, status: :created, location: @order }
      else  
        format.html { render action: "new" }
        format.json { render json: @order.errors, status: :unprocessable_entity }
      end
    end
Run Code Online (Sandbox Code Playgroud)

它给了我一个AbstractController :: DoubleRenderError如下:

AbstractController::DoubleRenderError in OrdersController#create

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return".
Run Code Online (Sandbox Code Playgroud)

如何解决这个问题呢?

zet*_*tic 16

如果您只需要渲染的HTML,并且不需要控制器的任何功能,您可以尝试直接在辅助类中使用ERB,例如:

module FaxHelper

  def to_fax
    html = File.open(path_to_template).read
    template = ERB.new(html)
    template.result
  end

end
Run Code Online (Sandbox Code Playgroud)

ERB文档更详细地解释这一点.

编辑

要从控制器获取实例变量,请将绑定传递给result调用,例如:

# controller
to_fax(binding)

# helper class
def to_fax(controller_binding)
  html = File.open(path_to_template).read
  template = ERB.new(html)
  template.result(controller_binding)
end
Run Code Online (Sandbox Code Playgroud)

注意:我从来没有这样做,但似乎可行:)


小智 6

使用#render_to_string方法

它的工作方式与典型的渲染方法相同,但在需要将一些模板化的HTML添加到json响应时非常有用

http://apidock.com/rails/ActionController/Base/render_to_string