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