开发日志:ActionView :: Template :: Error(未定义的方法`name'代表nil:NilClass):

时间:2013-04-22 18:09:47

标签: ruby-on-rails ruby-on-rails-3.2

我是新手,这是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

非常感谢任何和所有帮助。

4 个答案:

答案 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及更高版本。