如果/else在erb中执行代码,则不应该执行



感谢大家为我提供信息!有一些非常迅速的反应。我的解决方案是在if中使用更清晰的测试。语法获胜!

"你有一个nil对象,但你没想到!在评估nil时出错。name"

此错误指向下面带有"file.name"的行。

我明白为什么它的计算结果是nil.name并且是空的(应该是空的),但我不明白为什么代码会被执行。

它通过将if的测试更改为..来工作

if file[0] != nil

我觉得我遗漏了一个重要的细节,所以我很感激你能帮助我理解这一点。

在我看来,我有:

<table>
  <tr>
    <th>File</th>
    <th>Description</th>
  </tr>
  <% if !@files.empty? %>
    <% @files.each do |file| %>
    <tr>
      <td><%= file.name %></td>
      <td><%= file.description %></td>
      <td><%= link_to "Download", :controller => "files", :action => "download", :id => file.id %></td>
      <td><%= button_to "Delete", { :controller => "files", :action => "destroy", :id => file.id }, :method => "delete" %></td>
    </tr>
    <% end %>
  <% else %>
  <tr>
    <td><b>No files</b></td>
  </tr>
  <% end %>
</table>

在控制器中,我创建了一个名为@files的空数组,然后在创建值时插入值。

Ruby 1.8.7-p72轨道2.2.2

您想要的@files实例var要么是空数组

@files = []

或实际CCD_ 2对象

@files = File.all

但是您似乎以某种方式生成了一个包含nil元素的数组,例如

@files = [nil, <#File>, <#File>]

所以@files本身不是nil,而它的第一个元素是。因此,下面的代码返回true

@files.any?

相当于

!@files.empty?

因为CCD_ 5和CCD_。您的问题一定在相应的控制器中,您似乎在其中向@files添加了nil元素。

最新更新