簡體   English   中英

開發日志:ActionView :: Template :: Error(未定義的方法`name'代表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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM