使用ERB打印阵列元素

时间:2012-11-04 14:39:32

标签: ruby-on-rails ruby arrays erb

我正在尝试将我控制器中定义的简单数组打印到我的视图中,并为每个元素添加一个新行。但它正在做的是将整个阵列打印在一条线上。

这是我的控制器:

class TodosController < ApplicationController
  def index
    @todo_array = [ "Buy Milk", "Buy Soap", "Pay bill", "Draw Money" ]
  end
end

以下是我的观点:

<%= @todo_array.each do |t| %>
<%= puts t %><\br>
<% end %>

结果如下:

<\br> <\br> <\br> <\br> ["Buy Milk", "Buy Soap", "Pay bill", "Draw Money"]

5 个答案:

答案 0 :(得分:12)

你在视图中使用的模板引擎Erb有几种不同的方法可以在模板中嵌入ruby代码。

当你将代码放在<%= %>块中时,erb会评估里面的代码并打印HTML中最后一个语句的值。由于ruby中的.each返回您迭代的集合,因此使用<%= %>的循环会尝试打印整个数组的字符串表示。

当您将代码置于<% %>块内时,erb只会评估代码,而不是打印任何内容。这允许您在视图中执行条件语句,循环或修改变量。

您也可以从puts删除puts t。 Erb知道尝试将它在<%= %>内看到的最后一个值转换为字符串以供显示。

答案 1 :(得分:6)

嘿,你为什么要把'='标志放在第一行。 &lt; %%&gt;用于告诉rails这个下面的字符串是ruby代码,评估它。其中&lt;%=%&gt;这告诉rails这些标签中的字符串是ruby,评估它并在html文件中打印结果。

因此,请尝试检查您正在编写的代码

<%= @ todo_array.each do | t | %GT; 虽然这条线只用于迭代@todo_array,因此我们不需要打印那条线。所以最终的代码应该是

<% @todo_array.each do |t| %>
 <%= puts t %>
<% end %>

答案 2 :(得分:5)

您的观点有两个问题:

  1. 您正在使用“&lt;%=”,您应该使用“&lt;%”。
  2. 你不需要'put'
  3. 这可以改善您的结果:

    <% @todo_array.each do |t| %>
      <%= t %><\br>
    <% end %>
    

    我会进一步考虑使用一些HTML结构来更好地构建你的待办事项列表(而不是在行尾使用br标签),也许是这样的无序列表:

    <ul>
      <% @todo_array.each do |t| %>
        <li><%= t %></li>
      <% end %>
    </ul>
    

答案 3 :(得分:5)

试试吧:

<%= @todo_array.join('<br />').html_safe %>

而不是

<%= @todo_array.each do |t| %>
   <%= puts t %><\br>
<% end %>

答案 4 :(得分:2)

从每个陈述中删除等号:

<% @todo_array.each do |t| %>
  <%= t %><\br>
<% end %>