Как я могу избавиться от этого неприятного запроса в моем шаблоне представления Rails? - PullRequest
1 голос
/ 28 сентября 2011

Тьфу.Это сбивает меня с толку.

В моем контроллере:

@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

1 Ответ

1 голос
/ 28 сентября 2011

Нормально, это ужасно.

По крайней мере, вы можете вырвать повторяющийся блок 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

Если бы вы хотели, вы могли бы разбить его на помощника для каждого внутреннего цикла, но вы поняли идею.

...