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 贵族不再让我感到惊讶!

编辑:fflyer05:我尝试使用与 RailsCast 相同的代码迭代集合,并尝试在 perform_exercises[0] 上构建 perform_sets - 但它不起作用。做任何其他事情,我得到一个未初始化的常量 PerformedExercise::PerformedSet 错误

4

1 回答 1

2

模型方法应该在单个对象上调用。您正在对不起作用的对象集合调用它们,@workout.performed_exercises[0].performed_sets将。

注意 Rails cast 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.rbperformed_exercise.rb并且performed_set.rb对于那些各自的模型。

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

于 2010-08-29T03:29:49.350 回答