Rails忽略if和else语句

时间:2017-03-09 18:01:44

标签: ruby-on-rails ruby

首先,抱歉我的英语不好。

我有一个条件,在我的视图中将一个字符串放在一个变量中。

我的控制器

    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

但是如果我在我的视图中使用控制器中的相同逻辑它的效果非常好,我不明白为什么

1 个答案:

答案 0 :(得分:1)

Ruby当然不会忽略任何东西。不是故意的。问题出在您的代码中。您在控制器中运行一个循环,并为每个主机一次又一次地重新分配相同的两个变量。因此,他们将保留最后成本正确的值。

然后在视图中再次枚举主机。并且只使用那些[错误]预先计算的值。

这里最简单的解决方法是直接在视图中计算这些值,并抛弃控制器中的循环。

更好的做法是为控制器中的视图正确准备数据。现在,这里有几种可能性。使用&#34;查看模型&#34; (将主机及其视图特定数据(状态和警报)分组)或使用&#34;演示者&#34;。这些关键字在谷歌中提供了大量信息。