Инициализация дочерних моделей при создании модели - PullRequest
2 голосов
/ 28 марта 2012

У меня есть модель Entree, которая принадлежит модели Vin, которая сама принадлежит модели Producteur.

В форме для создания / издания Entree я хочу разрешить пользователю определять атрибуты родительских Vin и Producteur для их создания или извлекать их, если они существуют (извлечение на основе ввода пользователя).

На данный момент я выполняю следующие действия в действиях Entree new и edit:

@entree = Entree.new
@entree.vin = Vin.new    
@entree.vin.producteur = Producteur.new

и используйте fields_for помощник в форме, и это работает. Но я намерен иметь гораздо больше зависимостей с большим количеством моделей, поэтому я хочу, чтобы они оставались сухими. Я определил after_initialize обратный вызов в модели Vin, который выполняет инициализацию продукта:

class Vin < ActiveRecord::Base
  after_initialize :vin_setup

  def vin_setup
    producteur = Producteur.new
  end
end

и удалите producteur.new из контроллера. Однако при новом действии выдается ошибка:

неопределенный метод `model_name 'для NilClass: Class

для строки в форме, которая говорит

<%= fields_for @entree.vin.producteur do |producteur| %>

Полагаю, это означает, что обратный вызов after_initialize не действует так, как я ожидаю. Я что-то упускаю? Кроме того, я получаю ту же ошибку, если я определяю метод after_initialize в модели Vin вместо определения обратного вызова.

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Вам, вероятно, нужно

def vin_setup
  self.producteur = Producteur.new
end

Таким образом, вы инициализируете локальную переменную с именем producteur.

0 голосов
/ 28 марта 2012

Вы не можете зарегистрировать метод обратного вызова для события after_initialize.Вы должны реализовать метод с именем after_initialize.

Попробуйте это:

class Vin < ActiveRecord::Base
  def after_initialize
    self.producteur = Producteur.new if new_record?
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...