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
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
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