Неопределенный метод `call 'для nil: NilClass - PullRequest
0 голосов
/ 24 января 2012

Итак, я играю с Райаном Бейтсом Simple_Form railscast , и при попытке отправить форму я получаю следующую ошибку:

NoMethodError in Products#index

Showing /home/panos/sites/store/app/views/products/index.html.erb where line #8 raised:

undefined method `name' for nil:NilClass
Extracted source (around line #8):

5:     <h2><%= link_to product.name, product %></h2>
6:     <div>
7:       Price: <%= number_to_currency product.price %><br />
8:       Category: <%= product.category.name %><br />
9:       <%= link_to "Edit", [:edit, product] %>
10:     </div>
11:   <% end %>
Rails.root: /home/panos/sites/store

Application Trace | Framework Trace | Full Trace
app/views/products/index.html.erb:8:in `block in _app_views_products_index_html_erb___762171406_75615480_549568821'
app/views/products/index.html.erb:4:in `each'
app/views/products/index.html.erb:4:in `_app_views_products_index_html_erb___762171406_75615480_549568821'

Вот мой файл index.html.erb:

<% title "Products" %>

<div class="product">
  <% for product in @products %>
    <h2><%= link_to product.name, product %></h2>
    <div>
      Price: <%= number_to_currency product.price %><br />
      Category: <%= product.category.name %><br />
      <%= link_to "Edit", [:edit, product] %>
    </div>
  <% end %>
</div>

<p><%= link_to "New Product", new_product_path %></p>

А вот мой файл form.html.erb:

<%= simple_form_for @product do |f| %>
  <%= f.error_messages %>
  <table border="1">
  <tr>
  <td><%= f.input :name %></td>
  <td><%= f.input :price, :hint => "prices should be in USD" %></td>
  <td><%= f.input :released_on %></td>
  <td>  <%= f.association :category, :include_blank => false %></td>
  <td><%= f.input :rating, :collection => 1..5, :as => :radio %></td>
  <td><%= f.input :discontinued %></td>
  <td><%= f.button :submit %></td>
  </tr>

<% end %>

Я знаю, что ошибка возникает из-за того, что поле Category было пустым (nill), но я не знаю, как это исправить, чтобы оно могло отображаться даже со значением nill.

Кто-нибудь может помочь?

Ответы [ 3 ]

3 голосов
/ 24 января 2012

Или немного более кратко.

Category: <%= product.category.name if product.category %> или

Category: <%= product.category.try(:name) %>

Хотя метод try не одобряется многими людьми.

2 голосов
/ 24 января 2012

Попробуйте это:

Category: <%= product.category.name unless product.category.nil? %>
0 голосов
/ 24 января 2012

Вероятно, что хотя бы для одной строки значение product.category равно nil, поэтому возникает исключение, когда product.category разыменовывается для доступа к имени.

Из ответов, предоставленных навремя написания решения «разве что» защищает от ссылки на ноль.Решение «try» безопасно перехватывает исключение в случае возникновения исключения.

...