呸。它让我失望。
在我的控制器中:
@assessor = Assessor.find(params[:id])
@assessor.answers.build if @assessor.answers.empty?
在我看来:
= simple_form_for @assessor do |f|
- @assessor.candidates.each do |candidate|
- @assessor.assessment_competencies.each do |competency|
- if @assessor.answers.all?{|a| a.new_record?}
- competency.behaviors.each do |behavior|
= f.fields_for :answers do |f|
- @assessor.standard_answer_choices.each do |choice|
= f.input :assessor_id, :as => :hidden, :input_html => {:value => @assessor.id}
= f.input :candidate_id, :as => :hidden, :input_html => {:value => candidate.id}
= f.input :behavior_id, :as => :hidden, :input_html => {:value => behavior.id}
= f.input :competency_id, :as => :hidden, :input_html => {:value => competency.id}
= f.association :answer_choice, :collection => [choice], :as => :radio
- else
- competency.behaviors.each do |behavior|
- answer = Answer.find_or_create_by_behavior_id_and_assessor_id_and_candidate_id(behavior.id, @assessor.id, candidate.id)
= f.fields_for :answers, answer do |f|
= f.input :assessor_id, :as => :hidden, :input_html => {:value => @assessor.id}
= f.input :candidate_id, :as => :hidden, :input_html => {:value => candidate.id}
= f.input :behavior_id, :as => :hidden, :input_html => {:value => behavior.id}
= f.input :competency_id, :as => :hidden, :input_html => {:value => competency.id}
= f.association :answer_choice, :collection => [choice], :as => :radio
答案 0 :(得分:1)
Oof,这是一个多得多的人。
至少你可以将重复的fields_for
阻挡成一个帮手:
module AssessorsHelper
def answers_fields f, candidate, behavior, competency, answer=nil
assessor = f.object
f.fields_for :answers, answer do |f|
f.hidden_field :assessor_id, :value => assessor.id
f.hidden_field :candidate_id, :value => candidate.id
f.hidden_field :behavior_id, :value => behavior.id
f.hidden_field :competency_id, :value => competency.id
f.association :answer_choice, :collection => [choice], :as => :radio
end
end
end
那会把你的观点降低到这个:
= simple_form_for @assessor do |f|
- @assessor.candidates.each do |candidate|
- @assessor.assessment_competencies.each do |competency|
- if @assessor.answers.all?{|a| a.new_record?}
- competency.behaviors.each do |behavior|
= answers_fields f, candidate, behavior, competency
- else
- competency.behaviors.each do |behavior|
- answer = @assessor.answers.find_or_create_by_behavior_id_and_candidate_id behavior, candidate
= answers_fields f, candidate, behavior, competency, answer
如果你想要你可以将它分解为每个内循环的助手,但你明白了。