Нормально, это ужасно.
По крайней мере, вы можете вырвать повторяющийся блок 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
Если бы вы хотели, вы могли бы разбить его на помощника для каждого внутреннего цикла, но вы поняли идею.