使用ERB打印数组元素

5
尝试在视图中打印由控制器定义的简单数组,并为每个元素添加新行。但它所做的是将整个数组打印在一行上。
以下是我的控制器:
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个回答

14

Erb是您在视图中使用的模板引擎,它有几种不同的方法可以嵌入模板中的Ruby代码。

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

当您将代码放在<% %>块内时,Erb仅评估该代码,而不打印任何内容。这使您可以进行条件语句、循环或修改视图中的变量。

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


7

请尝试以下代码:

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

代替

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

6

嘿,为什么你在第一行放置'='符号。<% %>用于告诉Rails这个字符串是Ruby代码,请进行评估。而<%= %>则告诉Rails这个字符串是Ruby代码,请进行评估并将结果打印到HTML文件中。

因此,请检查您所编写的代码

<%= @todo_array.each do |t| %> 这一行仅用于遍历@todo_array,因此我们不需要打印该行。因此最终代码应该是:

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

就像你自己的回答所说,不需要使用 puts - <%= 会打印出结果。 - reesaspieces

5

你的观点有两个问题:

  1. 你在应该使用“<%”的地方使用了“<%=”。
  2. 你不需要使用“puts”

下面是改进后的内容:

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

我建议您使用一些HTML结构来更好地组织您的待办事项列表(而不是在行末使用br标签),例如无序列表:

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

2

从每个语句中删除等号:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接