2010-08-29 56 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 noobility不再让我惊叹!

编辑: fflyer05:我尝试使用相同的代码RailsCast与遍历集合,并试图建立在performed_exercises的performed_sets [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.rbperformed_exercise.rbperformed_set.rb这些相应的型号。

您的关系的定义看起来是正确的,所以错误的文件名是我能想到的唯一可能是错误的。

+0

非常感谢soooo fflyer05。我的PerformedSet模型文件名是perform_sets。 – MunkiPhD 2010-08-29 14:50:00

相关问题