Array.shift的问题

时间:2011-05-24 07:56:47

标签: ruby-on-rails ruby ruby-on-rails-3

我的控制器传递了两个实例变量@events = Event.all@images = Images.all。在视图中,我首先遍历@events.each do |event|,在此块中是行img = @images.shift但是当我尝试访问img的任何方法时,例如img.filename我收到错误imgnil,但我已检查并确定@images已正确填充。如果我只输出img.class,我会收到正确的类Image,但无法访问任何方法。

我做错了什么或为什么从数组中拉出实例的方法不正确?

我知道还有其他方法可以解决这个问题,但这个具体问题让我很困惑,我真的很想知道为什么这不起作用。感谢。

#Structure of the model is
Image
-filename :string
-date     :datetime
-caption  :text
-source   :string

#Controller
def index
  @events = Event.all
  @images = Image.all
end

#index.html.erb
<% @events.each do |event| %>
  ... code that works ...

  <% if count==1%>
    <% img = @images.shift %>
    <div><%= img.filename %></div>
  <% end %>

<% end %>

#For testing purposes I changed
<% img = @images.shift %>
<div><%= img.class %></div>

#output is Image

2 个答案:

答案 0 :(得分:2)

当有更多事件然后是图像时,可能会出现问题。因为每次迭代都经过@events数组,所以@images会被移位并从数组中获取下一个元素。因此,当您在@events中有4个元素而在@images中只有3个元素时,那么在第4次迭代时,从@images中获取第4个元素,这是nil

答案 1 :(得分:1)

有两种情况,Array#shift的返回值变为nil

  1. 数组最左边的元素是nil
  2. 数组为空(= [])。
  3. 可能是其中一种情况。