[英]Error ActionView::Template::Error (undefined method `name' for nil:NilClass)
[英]Development log: ActionView::Template::Error (undefined method `name' for nil:NilClass):
我是新手,這是Richard Schneeman撰寫的Rails教程。 這就是我的view / products文件夾中的index.html.erb文件中的所有內容。
<% first_product = Product.first %>
<% lots_of_products = Product.includes(:user).all %>
<ul>
<% lots_of_products.each do |product| %>
<li>
Product Name: "<%= product.name %>"" costs $<%= product.price %>
Sold by <%= product.user.name %>
</li>
<% end %>
</ul>
問題出在<%= product.user.name %>
,它給出了錯誤:
產品中的NoMethodError #index未定義方法`name'代表nil:NilClass。
我的控制器文件是vanilla,我的routes.rb有:
ControllerExercise::Application.routes.draw do
get '/products' => 'products#index'
resources :users
end
這是在模型中:
class Product < ActiveRecord::Base
belongs_to :user
attr_accessible :name, :price
end
class User < ActiveRecord::Base
has_many :products
attr_accessible :job_title, :name
end
非常感謝任何和所有的幫助。
你也可以試試
product.user.try(:name)
在您的數據庫中,我懷疑您的某些產品數據不包含sold_by_id或user_id。 所以它獲得product.user nil,因為沒有用戶與產品相關聯。 代替
<%= product.user.name %>
采用
<%= product.user.name if product.user %>
跳過此例外。
所以你的index.html.erb變成了
<% lots_of_products = Product.includes(:user).all %>
<ul>
<% lots_of_products.each do |product| %>
<li>
Product Name: <%= product.name %> costs $<%= product.price %>
Sold by <%= product.user.name if product.user %>
</li>
<% end %>
</ul>
我也反對這個,並使用了一個簡單的if else語句,因為即使用戶名不存在,我仍然希望顯示一些東西
<!-- SHOW USERNAME IF IT EXISTS -->
<% if product.user %>
<p><strong><%= product.user.name %></strong></p>
<% else %>
<p><strong>Anonymous</strong></p>
<% end %>
一個很好的解決方法是ruby的安全訪問操作員&。
見http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/
它是由Matz(ruby的創始人)為這種情況發明的。 在你的情況下,它看起來像
product.user&.name
如果未定義name屬性,則返回nil。 請記住它僅適用於ruby 2.3.0及更高版本。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.