Почему Rails возвращает мне `nil` при использовании ассоциаций?

#ruby-on-rails

#ruby-on-rails

Вопрос:

Когда я пытаюсь вызвать свой ChocolateController:

 @chocolate.kinds.new(name: "Bitter")
  

где

 class ChocolateController < ApplicationController
  def new
    @chocolate = Chocolate.new
  end
  

и где у меня в моих моделях:

 class Chocolate < ActiveRecord::Base
  has_many :kinds

class Kind < ActiveRecord::Base
  belongs_to :chocolate
  

Я получаю следующую ошибку:

 undefined method `new' for nil:NilClass  
  

Кто-нибудь, пожалуйста, может мне помочь, почему я получаю эту ошибку? Если вам нужно больше кода, я могу его предоставить. Просто спросите меня об этом в комментариях

Комментарии:

1. как выглядит ваш routes.rb файл?

2. @Отметить resources :chocolates, only: [:new, :edit, :update, :create]

3. Я предполагаю, что у вас есть belongs_to :chocolate в вашей модели Kind?

4. @henners66 да! Точно

5. странно — то, что у вас есть, должно работать, хотя стоило бы попробовать @chocolate.kinds << Kind.new(name: bitter) , чтобы увидеть, имеет ли это какое-либо значение.

Ответ №1:

Что вы могли бы сделать, это что-то вроде этого.

 @chocolate.kinds.build(name: "Bitter")
  

Проблема в том, что @chocolate.kinds при nil у @chocolate нет записей типа and, поэтому вы не получаете Kind модель обратно для вызова new. Даже если бы в нем были Kinds записи, вы бы вызывали new в коллекции, а не в Kinds модели.

Комментарии:

1. но я хочу сделать это правильным способом. Не совсем так. Нравится, как я пытаюсь

2. странно, но теперь он выдает мне NoMethodError: undefined method виды ‘для nil: NilClas`

3. @CdotStrifeVII — даже если записей нет, @chocolate.kinds все равно следует назначить — в конце концов, это всего лишь массив, который будет пустым, если не будут назначены объекты Kind — здесь происходит что-то еще, из-за чего rails неправильно соблюдает отношение has_many

4. хммм, да, здесь происходит что-то еще