2013-04-22 31 views
2

我是新手,这是Richard Schneeman的Rails教程。这就是我的view/products文件夹中的index.html.erb文件中的全部内容。开发日志:ActionView :: Template :: Error(未定义的方法名称为nil:NilClass):

<% 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 in Products#index undefined method `name' for nil:NilClass.

我的控制文件是香草和我的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 

任何和所有的帮助,不胜感激。

回答

5

在您的数据库中,我怀疑您的某些产品数据不包含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> 
+0

非常感谢!因此,为了发现它而花费一两个小时的时间来做这件事,我感到非常沮丧。 – ltrainpr 2013-04-22 18:53:46

10

您也可以尝试

product.user.try(:name) 
+0

非常感谢。你的答案也适用。这是一个耻辱,我不能投票你的答案。我没有15点的声望。 – ltrainpr 2013-04-22 20:51:08

+1

当你得到你的15名声望点数。那么你可以做到这一点... – 2013-04-23 05:59:11

0

我也碰到了这一点,并用一个简单的if else语句,因为我还是想展示即使用户名不存在

<!-- SHOW USERNAME IF IT EXISTS --> 

<% if product.user %> 
    <p><strong><%= product.user.name %></strong></p> 
<% else %> 
    <p><strong>Anonymous</strong></p> 
<% end %> 
0

对此的一个很好的解决方法是ruby的安全访问操作ator &。

看到http://mitrev.net/ruby/2015/11/13/the-operator-in-ruby/

它是由松本行弘(Ruby的创始人)这个特别的情况发明的。在你的情况下,它看起来像

product.user&.name 

它返回nil,如果名称属性未定义。请记住它仅适用于Ruby 2.3.0及更高版本。

相关问题