2011-06-30 171 views
1

我想让自己熟悉以下情况。Formtastic嵌套帮助

routine.rb

class Routine < ActiveRecord::Base 
    has_many :exercise_routines 
    has_many :exercises, :through => :exercise_routines 
    accepts_nested_attributes_for :exercise_routines 
end 

exercise_routine.rb

class ExerciseRoutine < ActiveRecord::Base 
    belongs_to :exercise 
    belongs_to :routine 
    has_many :attempts 
    accepts_nested_attributes_for :attempts 
end 

show.html#/程序/ show.html.haml

%h2 Exercises: 

%ol 
    - for exercise_routine in @routine.exercise_routines 
    %li= exercise_routine.exercise.name 
    %ul 
     %li 
     = exercise_routine.sets 
     Sets 
     %li 
     = exercise_routine.reps 
     Reps 
     %li 
     Attempt: 
     - for attempt in exercise_routine.attempts 
      = attempt.reps 
     = semantic_form_for @routine do |routine| 
      = routine.semantic_fields_for exercise_routine do |exercise_routine| 
      = exercise_routine.semantic_fields_for :attempts do |attempt| 
       = attempt.input :reps, :required => false 
      = routine.buttons` 

我遇到的麻烦是什么是两件事: 1)这是成功地为每个例程渲染尝试,如果我手动添加thro唉控制台,但如果我尝试更新它,我会得到:“未知属性:exercise_routine”我意识到,由于PARAMS:

{"utf8"=>"✓", 
"_method"=>"put", 
"authenticity_token"=>"51fZRe1wKRQoVUz+lGlldd4DmMODGHN203Htc4DEi0Y=", 
"routine"=>{"exercise_routine"=>{"attempts_attributes"=>{"0"=>{"reps"=>"5", 
"id"=>"1"}, 
"1"=>{"reps"=>"1555", 
"id"=>"2"}, 
"2"=>{"reps"=>""}}}}, 
"commit"=>"Update Routine", 
"id"=>"3"}` 

看起来不正确。它应该用一个id引用exercise_routines。

2)希望能够同时添加尝试。

@routine.exercise_routines.each do |er| 
    1.times {er.attempts.build} 
end 

正确渲染它,但当然我遇到了相同的参数问题。我要么做一些愚蠢的错误,要么这比我认为要做这种多集合嵌套更难?

回答

0

您没有正确使用fields_for。第一个参数必须用于嵌套字段的关联。第二个可以是用于关联值的/单个模型的集合。

= routine.semantic_fields_for :exercise_routines, exercise_routine do |f| 

此外,我建议不使用表单生成器块内部本地躲在第一局部exercise_routine。我将使用@routine.exercise_routines.each do |exercise_routine|表格而不是for循环。