2010-10-05 5 views
0

J'ai un formulaire imbriqué, structuré: Question has_many Answers. Donc, les questions sont à choix multiple.Forme imbriquée has_many modèle. Comment obtenir l'ID d'un article imbriqué?

vue forme actuelle:

- semantic_form_for @question do |f| 
    = f.error_messages 
    - f.inputs do 
    = f.input :question 
    = f.semantic_fields_for :answers do |builder| 
     = builder.input :content, :label => "Answer", :input_html => { :class => {'required', ' ckeditor'}} 
    = f.buttons 

Mon contrôleur question ressemble à:

def new 
    @question = Question.new 
    4.times { @question.answers.build } 
    end 

    def create 
    @question = Question.new(params[:question]) 
    @question.user_id = current_user.id 
    if @question.save 
     flash[:notice] = "Question added." 
     redirect_to questions_url 
    else 
     render :action => 'new' 
    end 
    end 

Tous assez simple. Cependant, maintenant je voudrais «sélectionner» la bonne réponse, de préférence sur la même page, tout en ajoutant. Je pense que je vais ajouter une nouvelle colonne aux questions contenant 'CorrectAnswerId' de quelque sorte. Mais, comment puis-je l'ajouter dans la vue & contrôleur?

Répondre

1

Je suppose que vous utiliseriez une sorte de case à cocher pour indiquer "C'est la bonne réponse".

Dans ce cas, vous pouvez simplement avoir la case à cocher contenir l'ID de la réponse et puis sur create vous pouvez définir la colonne correct_answer_id à la valeur d'identification de cette case à cocher.

Toutefois, comme vos réponses n'ont pas été enregistrées à ce stade (la génération ne crée que les objets en mémoire), vous n'avez pas les identifiants tant que les réponses ne sont pas déjà sauvegardées. La solution la plus simple consiste simplement à marquer la réponse comme correcte dans le tableau des réponses, plutôt que dans la table des questions. Ensuite, vous pouvez créer une méthode dans le modèle Question comme:

def correct_answer 
    @correct ||= answers.where(:is_correct => true) 
end 

Cela vous donnera également la possibilité de permettre plusieurs réponses si vous en avez besoin. Si cela n'est pas vraiment nécessaire, vous pouvez toujours ajouter .first à la fin de la chaîne de requête pour que vous renvoyiez une réponse plutôt qu'un tableau de bonnes réponses.

+0

thx lukas! travaillé parfaitement. J'ai fait une vérification jquery facile pour s'assurer qu'il n'y avait qu'une seule case à cocher à la fois, fonctionne aussi bien! :) –

Questions connexes