2010-10-28 12 views
1

J'ai travaillé avec rails3 et j'ai essayé de créer une application de sondage simple, mais certains problèmes ont été soulevés. Je peux très bien créer des questions, mais quand il s'agit de créer un sondage que les gens peuvent prendre, je suis confronté à certains problèmes. Pour une personne, les réponses ne sont pas assignées: user_id ou: survey_id. Ce qui suit est une copie de mes contrôleurs, modèles et vues.Création de sondages avec accepts_nested_form_for

Survey Controller

def take 
    @survey = Survey.find(params[:id]) 
    @questions = @survey.questions 
    @answers = @questions.map{|q| q.answers.build} 
    @answers.each do |a| 
    a.survey_id = @survey.id 
    a.user_id = current_user.id 
    end 

    respond_to do |format| 
    format.html # 
    end 
end 

def submit 
    @survey = Survey.find(params[:id]) 

    respond_to do |format| 
    if @survey.update_attributes(params[:survey]) 
     format.html { redirect_to(@survey, :notice => 'Survey was successfully submitted.')} 
     format.xml { head :ok } 
    else 
     format.html { render :action => "edit" } 
     format.xml { render :xml => @survey.errors, :status => :unprocessable_entity } 
    end 
    end 
end 

Modèle Enquête

class Survey < ActiveRecord::Base 
    belongs_to :user 
    has_many :questions, :dependent => :destroy 
    has_many :answers, :through => :questions, :dependent => :destroy 
    validates_presence_of :name, :user_id 
    accepts_nested_attributes_for :questions, :allow_destroy => true 
end 

Questions Modèle

class Question < ActiveRecord::Base 
    belongs_to :survey 
    has_many :answers 
    validates_presence_of :question_string, :question_type 
    accepts_nested_attributes_for :answers, :allow_destroy => true 
    end 

Modèle Réponses

class Answer < ActiveRecord::Base 
    belongs_to :question 
    belongs_to :user 
    belongs_to :survey 
    end 

Prenez Voir

%h1 Take the survey 
    - semantic_form_for @survey, :url => { :action => "submit" } do |s| 
    - if @survey.errors.any? 
     %p= pluralize(@survey.errors.count, "error") + " prohibited this survey from being saved" 
     #survey_errors 
     - @survey.errors.full_messages.each do |err_msg| 
      %p= err_msg 
    #survey_details.header 
    = s.fields_for :questions do |q| 
     = q.fields_for :answers do |a| 
     = render 'answer_fields', :s => a 

    .actions 
     = s.commit_button 

Questions partielles

#questions_form.fields 
    = s.input :question_string, :label => "Question: " 
    = s.input :question_type, :as => :radio, :collection => [1,2,3,4], :label => "Question Type:" 
    = s.hidden_field :_destroy 
    = link_to_function "Remove Question", "remove_fields(this)" 

Réponses partielles

#answers_form.fields 
    = s.label :answer_string, "Answer" 
    = s.text_field :answer_string 
    = s.hidden_field :question_id 

routes.rb

resources :surveys do 
     get 'take', :on => :member 
     put 'submit', :on => :member 
    end 

Répondre

0

essayer d'ajouter un autre caché FIE ld avec l'identifiant de l'utilisateur dans vos réponses partielles.

s.hidden_field :user_id, :value => x 

C'est comme ça que j'ai fait des champs cachés, vous ne faites que placer les variables. J'ai rencontré des problèmes de fusion en ne le passant pas en tant que paire de valeurs clés.


Qu'est-ce que vous utilisez? HAML, je ne comprends pas vraiment comment cela fonctionne.

C'est tout ce dont vous avez besoin pour que tout fonctionne.

modèle d'enquête

has_many :answers 
accepts_nested_attributes_for :answers, :allow_destroy => true 

Le contrôleur n'a pas besoin d'un code supplémentaire

La vue doit fields_for

<% f.fields for :answers do |f| %> 
    <%= f.hidden_field :user_id, :value => current_user.id %> 
<% end %> 
+0

merci. cela a fonctionné ... mais comment puis-je faire en sorte qu'il ne met à jour leurs réponses maintenant. parce que si je remplis le formulaire et que je me rafraîchis après la création des réponses ... il retourne les formulaires remplis avec les anciennes réponses et les nouvelles réponses – salbito

+0

Je ne suis pas sûr de savoir pourquoi les réponses anciennes et nouvelles sont affichées. Voulez-vous dire que les doublons sont créés? Je ne suis pas trop sûr. – s84