Rails 3.1.4 - 渲染:文本

时间:2012-03-30 00:51:20

标签: ruby-on-rails-3.1

我正在将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>

3 个答案:

答案 0 :(得分:11)

我知道这个问题仅适用于Rails 3.1.4。

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

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

答案 1 :(得分:10)

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

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

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

2014/6/23更新:回想起来,我不喜欢在控制器中使用此字符串解析逻辑。 @results表明在某个对象中嵌入了HTML。我建议使用演示文稿对象并调用@results.list之类的方法。 Draper宝石非常适合这种情况。

引用

答案 2 :(得分:1)

我建议您执行以下操作而不是渲染:文本

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方式来迭代你的列表。