Вложенные модели выдают неопределенную ошибку метода - PullRequest
0 голосов
/ 29 августа 2010

Я следил за RailsCast 197 , чтобы попробовать эти вложенные модели / формы и ломал голову над этим кодом более 2 часов, но безрезультатно. Что я пропускаю?

У меня есть следующие модели:

class Workout < ActiveRecord::Base
  belongs_to :user
  has_many :performed_exercises, :dependent => :destroy
  accepts_nested_attributes_for :performed_exercises
end

class PerformedExercise < ActiveRecord::Base
  belongs_to :workout
  belongs_to :exercise
  has_many :performed_sets, :dependent => :destroy
  accepts_nested_attributes_for :performed_sets
end

class PerformedSet < ActiveRecord::Base
  belongs_to :performed_exercise
end

В моем WorkoutsController у меня есть следующее:

  def new
    # We only need to build one of each since they will be added dynamically
    @workout = Workout.new
    @workout.performed_exercises.build
    @workout.performed_exercises.performed_sets.build
  end

Когда я запускаю тест и вызываю контроллер в браузере, я получаю следующую ошибку:

undefined method `performed_sets' for #<Class:0x7f6ef6fa6560>

Заранее благодарен за любую помощь - мое благонадежность RoR перестает меня удивлять!

Редактировать : fflyer05: я пытался использовать тот же код, что и в RailsCast, с итерацией по коллекции, а также пытался построить execute_sets на selected_exercises [0] - но это не работает Делая что-то еще, я получаю неинициализированную константу PerformedExercise :: PerformedSet error

1 Ответ

2 голосов
/ 29 августа 2010

Методы модели следует вызывать для одного объекта. Вы вызываете их в коллекции объектов, которые не будут работать, @workout.performed_exercises[0].performed_sets будет.

Обратите внимание на код из состава Rails 196:


# surveys_controller.rb
def new
  @survey = Survey.new
  3.times do
    question = @survey.questions.build
    4.times { question.answers.build }
  end
end

Чтобы построить форму, вам придется пройтись по каждому вложенному методу.

Если код такой:


for performed_exercise in @workout.performed_exercises
     for performed_set in performed_exercise.performed_sets
      # something interesting
     end
end

не работает, я проверю, чтобы убедиться, что имена файлов вашей модели правильные (для rails необходимо, чтобы они были единичными), в вашем случае у вас должны быть workout.rb, performed_exercise.rb и performed_set.rb для соответствующих моделей.

Определения ваших отношений выглядят правильными, поэтому неправильные имена файлов - единственное, о чем я могу думать, что это может быть неправильно.

...