14

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

我把它写到一个单独的 erb 文件中:views/orders/_fax.html.erb,并尝试渲染 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

它给了我一个 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".

如何解决这个问题呢?

4

4 回答 4

18

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

module FaxHelper

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

end

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

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

于 2013-01-16T03:58:28.453 回答
6

使用 #render_to_string 方法

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

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

于 2014-08-06T03:02:38.223 回答
0

如果您不想转义 html,只需调用 .html_safe 即可:

"<html><body>Hello World</body></html>".html_safe

关于您的错误,请发布您的 OrdersController - 看起来您在创建操作中不止一次调用渲染或重定向。

(顺便说一句,以防万一你尝试它 - 你不能在控制器中渲染部分 - 你只能在视图中渲染部分)

编辑:是的,您的问题是您尝试在控制器操作中呈现部分内容。您可以使用after_create回调来设置和发送传真 - 尽管您不想再次使用部分(因为它们用于视图)。http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

编辑:对于您的传真问题,您可以创建一个普通的 Ruby 类,请参阅 Yehuda 的这一极好的建议:https ://stackoverflow.com/a/1071510/468009

于 2013-01-16T03:09:54.463 回答
0

原因是您不能在给定时间多次在同一操作中呈现或重定向。

但是在您的代码中,您同时拥有renderredirect。我认为在你的控制器中你可以只使用渲染,假设你不需要任何 json 输出。

试试这个

def create
  @order.save   
  render(:partial => 'fax')
end

我没有对此进行测试,但我想你明白了:),并考虑一种处理错误的方法(以防订单未保存)。

于 2013-01-16T03:57:44.490 回答