0

我正在使用我的以下代码循环遍历对象列表View

<% @myquiz.each do |x| %>
    <div id="myDiv">
        <%= x.quiz_ID %>
    </div>
<% end %>

这很好用,它将 ID 打印到页面上。不过我觉得不用放那么多套<%s和<%=s会更干净

以下是可取的,但它不起作用:

<% @myquiz.each do |x|

    render :text "<div>#{x.quiz_ID}</div>"

end %>

有没有办法put在上面的循环中将信息显示在屏幕上,而无需 3 组<%标签?以及我想在页面上显示的每个后续值的另一个 <% 标记。

4

3 回答 3

2
<%= @myquiz.map(&:quiz_ID).join(', ') %>
于 2013-04-12T08:53:06.253 回答
1

这里有一些提示,只是为了提供一些关于 Ruby 方法的指针。

# Original
<%= @myquiz.each do |x|
    puts "<div>" . x.quiz_ID . "</div>"
end %>

<%= expression %>将使表达式在 HTML 中可见。因此,您必须操纵表达式的返回值。您正在使用.each那里,而为此目的.map更合适,因为它将返回一个数组,其中包含每个输入变量的块输出。

在块中最后一条语句是返回值,不需要打印东西。

最后,数组 like['A', 'B', 'C']仍然希望通过一些换行符加入,所以表达式需要加入.join('<br />').

这是一团糟,但无论如何,这里是:

<%= @myquiz.map {|x| "<div>#{ x.quiz_id }</div>" }.join("<br />").html_safe %>

# or

<%= @myquiz.map(&:quiz_id).map { |id| "<div>#{ id }</div>" }.join("<br />").html_safe %>

不要在家里这样做。严重地。只需注意 .map 的工作原理,它如何收集返回值(最后一条语句),以及如何连接数组元素以形成字符串。

更多选项:

DHH 会怎么做?大概使用额外的括号,或者将逻辑移动到其他地方(到帮助器或装饰器中)并输出某种<%= quiz_results %>.

我会怎么做?看看Slimslim-rails集成它和自动生成.html.slim视图。

# In a slim view
- @quizzes.each do |quiz|
  div = quiz.id
于 2013-04-12T10:17:24.053 回答
0

用咖喱括号做块

<%= @myquiz.each { |x| puts x.quiz_ID } =%>

如果 block 中的语句超过 2,则应该使用 'do-end' 编写 block,这是正确的。

于 2013-04-12T08:58:30.193 回答