【问题标题】:Rails (Object doesn't support #inspect) / NoMethodError (undefined method `[]' for nil:NilClass)Rails(对象不支持#inspect)/ NoMethodError(nil:NilClass 的未定义方法“[]”)
【发布时间】:2019-04-26 08:23:53
【问题描述】:

我有一个模型“部分”。每当我尝试迭代 Section 对象时,例如“Section.all”或“Section.create”,我在 Rails 控制台和“NoMethodError(未定义方法`[] ' for nil:NilClass)" 在终端中。

红宝石:红宝石 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):

Rails 控制台输入

Section.all

Rails 控制台输出

(Object doesn't support #inspect)

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

#<ActiveRecord::Relation []> 

【问题讨论】:

  • 猜测,这可能是问题所在:belongs_to :class, :class_name =&gt; "Standard", :foreign_key =&gt; "standard_id"。这将尝试定义一个方法Section#class,它与Object#class 冲突。一般来说,在代码中调用 class 是个坏主意。如果你实在想不出其他名字(例如class_group?),就叫它klass(加上k)。
  • 顺便说一句,我曾经做过一段时间的学校申请。我们经常遇到这种问题。事实证明,软件和教育系统经常在“关键词”上发生冲突……例如,parentchild 这样的名称,如果你不小心,也会导致问题!
  • @TomLord 感谢您的详细解释。这就是问题所在。我使用 Standard 而不是 Class 并且它有效。非常感谢。 :)
  • @TomLord,我也有一个 Parent 模型。它会产生类似的问题吗?
  • 不适用于这个特定的东西...但是,例如,如果您生成“父”具有特殊含义的 XML,则可能需要小心。

标签: ruby-on-rails


【解决方案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 的列,它有,这就是为什么您不需要在belongs_to 模型中设置FK。

另一方面,Rails 无法推断 has_many 模型中的 FK,因为它期望在表 sections 上有一个名为 standard_id 的列,但它被命名为 class_id,所以你需要设置手动输入正确的列名。

希望对你有帮助。

【讨论】:

  • CAmador 你是完全正确的。但我已经正确定义了关联。这是汤姆提到的“类”类名的问题。谢谢:)
猜你喜欢
  • 2015-06-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-14
  • 2013-01-14
  • 2017-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多