2

我是新手,这是 Richard Schneeman 的 Rails 教程。这就是我的视图/产品文件夹中的 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 %>,它给出了错误:

Products#index 中的 NoMethodError 用于 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

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

4

4 回答 4

13

你也可以试试

product.user.try(:name)
于 2013-04-22T19:32:03.840 回答
8

在您的数据库中,我怀疑您的某些产品数据不包含 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>
于 2013-04-22T18:16:20.123 回答
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 %>
于 2015-06-05T09:19:40.527 回答
0

一个很好的解决方法是 ruby​​ 的安全访问运算符 &。

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

它是由 Matz(ruby 的创始人)针对这种情况发明的。在你的情况下,它看起来像

product.user&.name

如果未定义 name 属性,则返回 nil。请记住,它仅在 ruby​​ 2.3.0 及更高版本中可用。

于 2017-10-19T21:35:11.513 回答