【问题标题】:How to solve error (undefined method `name' for nil:NilClass)如何解决错误(nil:NilClass 的未定义方法“名称”)
【发布时间】:2016-02-17 08:08:48
【问题描述】:

我得到这个错误,如何解决这个关系错误

我有一个模型叫property.rb

class Property < ActiveRecord::Base
    belongs_to :rm
    belongs_to :category
end

我也有 category.rb

class Category < ActiveRecord::Base
    has_many :rms,dependent: :destroy
    has_many :properties,dependent: :destroy
end

我的 RM(关系经理)模型是

class Rm < ActiveRecord::Base
  acts_as :user
  belongs_to :category
  has_many :properties
end

在我的控制器中,我列出了这样的属性

class Rms::PropertiesController < ApplicationController
  before_filter :authenticate_user!
  before_action :set_property, only: [:show, :edit, :update, :destroy]
  def index
    @properties = Property.all
  end
 def property_params
 params.require(:property).permit(:seller_name,:rm_id,:category_id,:property_type_id,:seller_email,:seller_phone,:property_name)
  end
end

在我的视图页面中 我在 index.html.erb 中列出了 RM 添加的属性

    <% @properties.each do |property| %>
      <tr>
        <td><%= property.seller_name %></td>
        <td><%= property.seller_email %></td>
        <td><%= property.seller_phone %></td>
        <td><%= property.category.name %></td>
        <td><%= property.property_name %></td>
   <% end %>

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord


    【解决方案1】:

    nil:NilClass 的未定义方法“名称”

    这是因为property 之一没有与之关联的category。直接的解决方法是使用try 方法。

    <%= property.category.try(:name) %>
    

    【讨论】:

      【解决方案2】:

      确保category 始终与property 关联。

      在属性模型中添加:

      validates :category, presence: true
      

      如果您的产品不一定总是有类别,您可以使用安全导航(这几乎总是一个丑陋的解决方案):

      product.category.try(:name) # Ruby <  2.3.x
      product.category&.name      # Ruby >= 2.3.x
      

      【讨论】:

        【解决方案3】:

        这是因为property 没有与之关联的category。 所以

        <td><%= property.category.name %></td>
        

        抛出错误

        nil:NilClass 的未定义方法“名称”

        因为 name 不存在于 nil 类中,在本例中为 category 您可以使用名为 andand 的 gem 来处理此类情况。 安装 gem 后,只需将代码重写为:

        <td><%= property.andand.category.name %></td>
        

        【讨论】:

        • 你安装了 gem andand 吗?
        • 请在您的 Gemfile 中列出 andand 并运行 bundle install
        • 如果我尝试尝试,它会在代码中产生任何问题吗?
        • 不,这不会造成问题。这不是最佳编码实践。就这样。使用 try 可以正常工作:)
        【解决方案4】:

        可能是该属性没有类别。尝试使用:

        <%= property.category.name rescue nil%>
        

        【讨论】:

        • 不会成功,因为 issue 是引发的异常,而不是 nil
        • @AndreyDeineko - 我已经尝试过这段代码,它解决了这个问题,因为救援用于处理异常:)
        • 我的意思是这个解决方案没有多大意义,因为它只是一个创可贴
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-27
        • 1970-01-01
        • 2012-03-08
        相关资源
        最近更新 更多