首先,抱歉我的英语不好。
我有一个条件,在我的视图中将一个字符串放在一个变量中。
我的控制器
def index
@hosts= Host.all
@hosts.each do |host|
if host.ativo?
@status = "Sim"
else
@status = "Não"
end
if Time.zone.now > host.validade
flash[:info] = "Você tem hosts expirados !"
@alerta = "Expirado !"
else
@alerta = "Válido !"
end
end
end
我的观点
<tbody>
<% @hosts.each do |host| %>
<tr>
<td><%= link_to host.id, host_path(host),class: 'btn btn-default btn-xs'%></td>
<td><%= host.mac %></td>
<td><%= host.nome %></td>
<td><%= host.descricao %></td>
<td><%= @status %></td>
<td><%= host.validade.strftime("%d/%m/%Y %H:%M")%></td>
<td><%= @alerta %></td>
<td>
<%= link_to t('.edit', :default => t("helpers.links.edit")),
edit_host_path(host), :class => 'btn btn-default btn-xs' %>
<%= link_to t('.destroy', :default => t("helpers.links.destroy")),
host_path(host),
:method => :delete,
:data => { :confirm => t('.confirm', :default => t("helpers.links.confirm", :default => 'Are you sure?')) },
:class => 'btn btn-xs btn-danger' %>
</td>
</tr>
<% end %>
</tbody>
</table>
</div>
但在我的@alerta varibale中,我只得到字符串&#34; Expirado&#34;在@status我只得到&#34; Sim&#34;即使是@ host.ativo?返回false和Time.zone.now&lt;比host.validade
但是如果我在我的视图中使用控制器中的相同逻辑它的效果非常好,我不明白为什么
答案 0 :(得分:1)
Ruby当然不会忽略任何东西。不是故意的。问题出在您的代码中。您在控制器中运行一个循环,并为每个主机一次又一次地重新分配相同的两个变量。因此,他们将保留最后成本正确的值。
然后在视图中再次枚举主机。并且只使用那些[错误]预先计算的值。
这里最简单的解决方法是直接在视图中计算这些值,并抛弃控制器中的循环。
更好的做法是为控制器中的视图正确准备数据。现在,这里有几种可能性。使用&#34;查看模型&#34; (将主机及其视图特定数据(状态和警报)分组)或使用&#34;演示者&#34;。这些关键字在谷歌中提供了大量信息。