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

Posted

技术标签:

【中文标题】如何直接从 Rails 控制器返回 HTML?【英文标题】:How to return HTML directly from a Rails controller? 【发布时间】:2009-12-24 15:43:47 【问题描述】:

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

我想编写一个控制器动作,直接从控制器返回这个 HTML,而不是像控制器上的其他动作那样通过 .erb 模板传递它。

我的第一个想法是将这个动作拉到一个新的控制器中并制作一个带有空布局的自定义 .erb 模板,模板中只有 <%= modelObject.htmlContent %> - 但我想知道在 Rails 中是否有更好的方法来做到这一点.

【问题讨论】:

【参考方案1】:

在您的控制器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

【讨论】:

api.rubyonrails.org/classes/ActionView/Rendering.html 的(稀疏)文档,以防其他人正在寻找它! :) 真的有必要使用respond_to 块吗? render :text =&gt; '&lt;h1&gt;text&lt;/h1&gt;' 在 Rails 4 中对我来说工作得很好。我虽然 respond_to 只是为了处理多个 Accept-Types。 Rails 5 在使用 render text: … 时会产生弃用警告。如果要呈现 HTML,请使用 render html: …,对于文本使用 render plain: …【参考方案2】:

至少在最新的 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

【讨论】:

以上是关于如何直接从 Rails 控制器返回 HTML?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails - 从视图调用控制器方法

如何从控制器路由 Rails 4 获得不同的和多个视图

如何使用 AJAX 请求将用户在类变量中的 HTML5 位置从 JavaScript 传递到 Rails 控制器?

rails如何从命令行调用运行本地服务器的控制器操作[重复]

如何将 json 数据从 ruby​​ 控制器传递到 javascript (Rails 6.1)?

如何从 Rails 中的控制器混入和调用 link_to?