2015-09-14 2 views
1

J'essaie de créer un formulaire imbriqué pour un levé et de rencontrer des problèmes avec mes valeurs de hachage params dans le bloc fields_for.Rails fields_for params blank

J'ai les modèles suivants. La façon dont l'application fonctionne est qu'un administrateur crée un MiniPost et son MiniPostQuestions. Ensuite, un client crée un nouveau MiniPostSurvey en utilisant l'un des MiniPosts. Le client envoie alors un e-mail à SurveyInvites aux utilisateurs. Lorsqu'un utilisateur répond, un nouveau SurveyResponse est créé, ainsi qu'un nouveau QuestionAnswer pour chaque MiniPostQuestion de l'enquête.

class MiniPost < ActiveRecord::Base 
    has_many :mini_post_questions 
    has_many :question_answers, through: :mini_post_questions 
    has_many :mini_post_surveys 

    belongs_to :employer 

    def questions 
     mini_post_questions 
    end 

    def surveys 
     mini_post_surveys 
    end 
end 

class MiniPostQuestion < ActiveRecord::Base 
    has_many :question_answers 

    belongs_to :mini_post 
    belongs_to :employer 

    def answers 
     question_answers 
    end 
end 

class MiniPostSurvey < ActiveRecord::Base 
    belongs_to :mini_post 
    belongs_to :employer 
    belongs_to :company 
    has_many :survey_invites 
    has_many :survey_responses, through: :survey_invites 

    def questions 
     mini_post.questions 
    end 
end 

class SurveyInvite < ActiveRecord::Base 
    belongs_to :mini_post_survey 
    has_many :survey_responses 

    def responses 
     survey_responses 
    end 
end 

class SurveyResponse < ActiveRecord::Base 
    belongs_to :survey_invite 
    has_many :question_answers 
    has_many :mini_post_questions, through: :question_answers 
end 

class QuestionAnswer < ActiveRecord::Base 
    belongs_to :survey_response 
    belongs_to :mini_post_question 
    validates :answer, presence: true 
end 

Voici ma forme de réponse.

<div class="form-box"> 
    <%= form_for @response, url: "/survey?key=#{@invite.key}", method: :post, html: { role: 'form' } do |f| %> 
     <% @questions.each do |question| %> 
      <div class="form-group"> 
       <%= f.fields_for :mini_post_questions, question do |q| %> 
        <%= q.fields_for :question_answers, question.question_answers.build do |a| %> 
         <%= f.label question.question %> 
         <%= a.text_area :answer, class: 'form-control' %> 
         <%= a.hidden_field :survey_response_id, value: @survey.id %> 
        <% end %> 
       <% end %> 
      </div> 
     <% end %> 

     <div><%= f.submit "Submit", :class => "btn btn-primary" %></div> 
    <% end %> 
</div> 

Ma forme rend correctement, mais quand je le soumets, mon hash params ressemble à ceci:

{"utf8"=>"✓", 
"authenticity_token"=>"p8Tky2So10TH4FUUvLKhIh7j2vjNN39b3HDsF0cYE14=", 
"survey_response"=>{"mini_post_questions"=>{"question_answers"=>{"answer"=>"", "survey_response_id"=>"11"}}}, 
"commit"=>"Submit", 
"key"=>"e4fab42244db2286d471082696", 
"controller"=>"surveys", 
"action"=>"create"} 

je me attends une clé mini_post_question pour chaque question, mais je ne suis pas sûr de savoir comment arriver à ce point.

Répondre

1

Je pense que vous êtes sur la bonne voie, mais vous devez demander à vos modèles d'accepter les attributs imbriqués pour les objets que vous voulez dans votre formulaire.

Je pense donc que dans votre modèle SurveyResponse, vous auriez

class SurveyResponse < ActiveRecord::Base 
    belongs_to :survey_invite 
    has_many :question_answers 
    accepts_nested_attributes_for :question_answers 
    has_many :mini_post_questions, through: :question_answers 
end 

De plus, comme il semble que vous ne modifiez pas la mini-question ici, je dirais que vous n'avez pas besoin d'accepter des attributs imbriqués pour les questions, mais juste un champ caché qui affecte le mini_question_id au question_answer

Ainsi, votre formulaire doit être quelque chose comme ça

<div class="form-box"> 
    <%= form_for @response, url: "/survey?key=#{@invite.key}", method: :post, html: { role: 'form' } do |f| %> 
     <% @questions.each do |question| %> 
      <div class="form-group"> 
       <%= f.fields_for :question_answers, @survey.question_answers.build do |q| %> 
        <%= q.label question.question %> 
        <%= q.text_area :answer, class: 'form-control' %> 
        <%= q.hidden_field :mini_post_question_id, value: question.id %> 
       <% end %> 
      </div> 
     <% end %> 

     <div><%= f.submit "Submit", :class => "btn btn-primary" %></div> 
    <% end %> 
</div> 

Étant donné que votre formulaire accepte les attributs imbriqués pour question_answers, vous n'avez pas besoin de fournir le survey_id.

Cela devrait vous rapprocher de ce dont vous auriez besoin dans votre formulaire.

+0

Génial! Merci! En rétrospective, je ne peux pas croire que j'ai oublié d'ajouter 'accept_nested_attributes' car c'est tellement basique, mais la structure du formulaire était assez compliquée. – ACIDSTEALTH

+0

Je suis content que cela vous a aidé :) –