我是新手,这是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 undefined method`name'for 零: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
非常感谢任何和所有帮助。
答案 0 :(得分:11)
您也可以尝试
product.user.try(:name)
答案 1 :(得分:6)
在您的数据库中,我怀疑您的某些产品数据不包含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>
答案 2 :(得分:0)
我也反对这个并使用了一个简单的if else语句,因为即使用户名不存在我仍然想要显示一些东西
$(this).data('profile-name'))
答案 3 :(得分:0)
一个很好的解决方法是ruby的安全访问操作员&amp;。
请参阅http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/
这是由Matz(ruby的创始人)为这种情况发明的。在你的情况下,它看起来像
product.user&.name
如果未定义name属性,则返回nil。请记住它仅适用于ruby 2.3.0及更高版本。