Rails(对象不支持#inspect)/ NoMethodError(nil:NilClass的未定义方法“ []”)

时间:2019-04-26 08:23:54

标签: ruby-on-rails

我有一个模型“ Section”。每当我尝试遍历Section对象(例如“ Section.all”或“ Section.create”)时,都会在Rails控制台中出现“(对象不支持#inspect)”错误,并出现“ NoMethodError(未定义方法`[]”)错误'代表nil:NilClass)”。

由于它已成为路障,所以我真的需要一些帮助。

Ruby:ruby 2.6.1p33

路轨:5.2.3

部分迁移

class CreateSections < ActiveRecord::Migration[5.2]
  def change
    create_table :sections do |t|
      t.string :name
      t.integer :students_count, :default => 0
      t.references :class, index: true
      t.references :class_teacher, index: true

      t.timestamps
    end
    add_foreign_key :sections, :standards, column: :class_id
    add_foreign_key :sections, :users, column: :class_teacher_id
  end
end

部分模型

class Section < ApplicationRecord
  belongs_to :class, :class_name => "Standard", :foreign_key => "standard_id"
  belongs_to :class_teacher, :class_name => "User", :foreign_key => "class_teacher_id"
end

控制器代码

def index
  @sections = Section.where(:class_id => params[:class_id])

  render json: @sections
end

端子输出

NoMethodError (undefined method `[]' for nil:NilClass):

滚动控制台输入

Section.all

设置控制台输出

(Object doesn't support #inspect)

奇怪的是,当Section表为空时,控制台输出为

#<ActiveRecord::Relation []> 

谢谢。

1 个答案:

答案 0 :(得分:1)

除了@Tom Lord的评论,您还必须更正关联:

class Section < ApplicationRecord
  belongs_to :class, class_name: "Standard"                    
  belongs_to :class_teacher, class_name: "User"
end

由于您的迁移创建了class_idclass_teacher_id作为参考,因此正确的FK名称就是这些。

您需要在has_many模型上设置FK:

class Standard < ApplicationRecord
  has_many :sections, foreign_key: :class_id
end

更新: FK始终在 belongs_to 表上创建。由于您设置的关联名为class,因此Rails希望表中存在名为class_id的列,这就是为什么您不需要在{{1}中设置FK的原因}模型。

另一方面,Rails无法推断belongs_to模型中的FK,因为它期望表has_many上有一个名为standard_id的列,但它名为{{ 1}},因此您需要手动设置正确的列名称。

希望有帮助。