2013-03-05 3 views
1

Может кто-нибудь сказать, почему этот код работает?rails: loop in loop error

<% @products.each do |p| %> 
     <%= link_to p.name, product_path(p.id), :class => "title" %> 
    <%end%> 

И это не так?

<% @products.in_groups_of(2).each do |product_array| %> 
     <% product_array.each do |p| %> 
      <%= link_to p.name, product_path(p.id), :class => "title" %> 
     <% end %> 
    <%end%> 

Код дает ошибку неопределенного метода `name 'для nil: NilClass. Я не понимаю этого. Может ли кто-нибудь помочь?

+0

является это дает вам ошибку? Вы можете сказать нам, что это такое? – sevenseacat

+0

@sevenseacat undefined метод 'name 'для nil: NilClass – user1977201

ответ

2

дописывает nil, если нет достаточного количества записей, поэтому он дает nil:NilClass ошибку

>> %w(1 2 3).in_groups_of(2)  # => [["1", "2"], ["3", nil]] 
>> %w(1 2 3).in_groups_of(2,false) # => [["1", "2"], ["3"]] 

см in_groups_of(number, fill_with = nil)

<% @products.in_groups_of(2, false).each do |product_array| %> 
    <% product_array.each do |p| %> 
     <%= link_to p.name, product_path(p.id), :class => "title" %> 
    <% end %> 
<%end%> 
+0

Спасибо shweta. Это сработало! – user1977201

0

Похоже, что у вас есть нечетное количество продуктов. Если вы попытаетесь разделить нечетное число на группы по два, конечный продукт в последней группе будет равен нулю. Вы можете просто добавить:

unless p.nil? 
    <%= link_to p.name, product_path(p.id), :class => "title" %> 
end 

, чтобы убедиться, что у вас есть экземпляр.

+1

да, вы правы. Какое решение для этого? – user1977201