2

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

“你没想到有一个 nil 对象!评估 nil.name 时出错”

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

我明白为什么它评估为 nil.name 并且是空的(应该是)但我不明白为什么该代码甚至被执行。

它通过更改 if to 的测试来工作。

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 Rails 2.2.2

4

1 回答 1

0

您在@files实例 var 中想要的是一个空数组

@files = []

或实际File物体

@files = File.all

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

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

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

@files.any?

这相当于

!@files.empty?

因为@files.is_a? Arraynot @files.nil?。您的问题必须在相应的控制器中,您似乎在其中添加了一个nil元素到您的@files.

于 2012-07-08T10:15:18.340 回答