if / else在erb执行代码时不应该

时间:2012-07-08 06:12:35

标签: ruby-on-rails ruby erb

感谢向所有人提供信息!有一些非常快速的回应。我的解决方案是在if中使用更清晰的测试。胜利的语法!

“当你没想到它时,你有一个零对象!评估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 Rails 2.2.2

1 个答案:

答案 0 :(得分:0)

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

@files = []

或实际File个对象

@files = File.all

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

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

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

@files.any?

相当于

!@files.empty?

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