2010-08-29 1 views
0

Я слежу за 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 перестает меня удивлять!

Edit: fflyer05: Я пытался использовать один и тот же код, что и RailsCast с Перебор коллекции, а также попытки построить performed_sets на performed_exercises [0] - но он не работает. Выполняя что-нибудь еще, я получаю неинициализированную константу. Ошибка PerformedExercise :: PerformedSet

ответ

2

Методы модели должны быть вызваны на одном объекте. Вы вызываете их в коллекции на объекты, которые не будут работать, @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 
 

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

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

+0

Спасибо soooo much fflyer05. Имя файла модели PerformedSet было выполнено_sets. – MunkiPhD

 Смежные вопросы

  • Нет связанных вопросов^_^