0

So I'm playing around with Ryan Bates Simple_Form railscast, and I get the following error when I try to submit a form:

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'

Here is my index.html.erb file:

<% 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>

And here is my form.html.erb file:

<%= 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 %>

I know the error is produced because the Category field was empty (nill), but I dont know how to fix it, so that it can display even with a nill value.

Can anybody help?

3 Answers3

3

Or a little more concisely.

Category: <%= product.category.name if product.category %> or

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

Although the try method is frowned on by alot of people.

Bradley Priest
  • 7,438
  • 1
  • 29
  • 33
2

Try this:

Category: <%= product.category.name unless product.category.nil? %>
davidb
  • 8,884
  • 4
  • 36
  • 72
0

It seems likely that for at least one row, the value of product.category is nil, so an exception is hit when product.category is dereferenced to access 'name'.

Of the answers provided at time of writing, the 'unless' solution guards against referencing nil. The 'try' solution catches the exception safely in the case where the exception occurs.

Snips
  • 6,575
  • 7
  • 40
  • 64