【问题标题】:Rails 3.1.4 - Render :textRails 3.1.4 - 渲染:文本
【发布时间】:2012-03-30 00:51:20
【问题描述】:

我正在将我的 rails 2 应用程序更新为 rails 3 并发现使用 'render :text' 的行为不再相同。

@results 是一个数组。在我的控制器中:

render :text => "<ul>#{@results}</ul>"

它将整个数组作为字符串返回,而不是遍历每个值:

<ul>
  ["
  <li>Steve</li>
  ", "
  <li>John</li>
  "]
</ul>

在 Rails 2.x 中运行良好,但在 3 中不行。我该如何解决这个问题?

我期待以下结果:

<ul>
  <li>Steve</li>
  <li>John</li>
</ul>

【问题讨论】:

    标签: ruby-on-rails-3.1


    【解决方案1】:

    我知道这个问题只针对 Rails 3.1.4。

    但是那些来到这里并使用更新版本的人,从 Rails 5.1 开始,我们会这样做:

    render plain: "I'm like everyone else."
    

    【讨论】:

    • 不错。请注意,这会将Content-Type 标头设置为text/plain(在字符集中)。如果您来这里寻找如何呈现 HTML(但不在模板文件中),请使用 render html: '&lt;div&gt;...&lt;/div&gt;'。这会将标头设置为text/html,您的浏览器将知道解析 hTML。 (可能在您的 html 字符串上调用 .html_safe,但要小心。)
    【解决方案2】:

    该字符串包含 HTML 标签,因此您需要将其标记为安全,这样 Rails 就不会转义标签。

    render :text => "<ul>#{@results}</ul>".html_safe
    

    注意:除非有正当理由在控制器中包含 HTML,否则我建议将列表项移动到视图中。

    2014 年 6 月 23 日更新:回想起来,我不喜欢在控制器中有这个字符串解析逻辑。 @results 表明在某处的对象中嵌入了 HTML。我建议使用演示对象并调用像@results.list 这样的方法。 Draper gem 非常适合这个。

    引用

    【讨论】:

      【解决方案3】:

      我建议执行以下操作而不是 render :text

      render :partial => "result", :collection => @results
      

      并添加文件:_result.html.erb with

      <ul>
        <%= result %>
      </ul>
      

      如果您可以从@results 中删除 li 标签,效果会更好

      <ul>
        <li><%= result %></li>
      </ul>
      

      Rails 3 文档说渲染文本应该用于非 HTML 文本,这不适合您的用例。使用 render :partial :collection 是一种更好、更多的 rails 3 迭代列表的方法。

      【讨论】:

        猜你喜欢
        • 2012-10-23
        • 2021-01-05
        • 2010-10-09
        • 2018-10-27
        • 1970-01-01
        • 1970-01-01
        • 2011-09-09
        • 2022-11-29
        • 1970-01-01
        相关资源
        最近更新 更多