Rails (объект не поддерживает #inspect) / NoMethodError (неопределенный метод `[] 'для nil: NilClass) - PullRequest
0 голосов
/ 26 апреля 2019

У меня есть модель "Секция". Всякий раз, когда я пытаюсь перебрать объект Section, например, "Section.all" или "Section.create", я получаю сообщение об ошибке как "(Object не поддерживает #inspect)" в консоли rails и "NoMethodError (неопределенный метод` []). 'для 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):

Рельсовая консоль Input

Section.all

Вывод консоли Rails

(Object doesn't support #inspect)

Странно, когда таблица разделов пуста, вывод консоли

#<ActiveRecord::Relation []> 

Заранее спасибо.

1 Ответ

1 голос
/ 26 апреля 2019

Помимо комментария @Tom Lord, вы должны исправить ассоциации:

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

Поскольку ваша миграция создает class_id и class_teacher_id для ссылок, правильные имена FK таковы.

Вам нужно установить FK на моделях has_many:

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

UPDATE: ФК всегда создаются на принадлежащих_ таблицах. Поскольку установленная ассоциация называется class, Rails ожидает, что в таблице будет присутствовать столбец с именем class_id, поэтому он не требует установки FK в модели belongs_to.

С другой стороны, Rails не может вывести FK в модели has_many, потому что он ожидает столбец с именем standard_id в таблице sections, но он называется class_id, поэтому вам нужно установить правильное имя столбца от руки.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...