如何直接从Rails控制器返回HTML?


72

我的一个模型对象有一个“文本”列,其中包含网页的完整HTML。

我想编写一个控制器动作,该动作只是直接从控制器返回此HTML,而不是像在控制器上其余动作一样通过.erb模板传递它。

我的第一个想法是将该操作放入新的控制器中,并在模板中创建一个具有空布局的自定义.erb<%= modelObject.htmlContent %>模板-但我想知道在Rails中是否有更好的方法可以做到这一点。

Answers:


100

在控制器respond_to块中,可以使用:

render :text => @model_object.html_content

要么:

render :inline => "<%= @model_object.html_content %>"

因此,类似:

def show
  @model_object = ModelObject.find(params[:id])

  respond_to do |format|
    format.html { render :text => @model_object.html_content }
  end
end

5
api.rubyonrails.org/classes/ActionView/Rendering.html上的(稀疏)文档,以防其他人在寻找它!:)
Jo Liss 2010年

8
真的有必要使用该respond_to块吗?render :text => '<h1>text</h1>'在Rails 4中对我来说工作正常。我respond_to只是要处理多个Accept-Type。
西罗Santilli郝海东冠状病六四事件法轮功

7
使用时,Rails 5会产生弃用警告render text: …。如果要呈现HTML,请使用render html: …,以供文本使用render plain: …
Michael Trojanek '17

69

至少在最新的Rails(4.1.x)中,这比公认的答案要简单得多:

def show
  render html: '<div>html goes here</div>'.html_safe
end

3

它对我有用

def show
  @model_object = ModelObject.find(params[:id])

   respond_to do |format|
    format.html { render :inline => "<%== @model_object['html'] %>" }
  end
end
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.