2010-10-26 23 views
2

Dites que je crée un Q & Un site comme StackOverflow. J'ai deux ressources: Question et Réponse. J'utilise des routes de ressources Rails REST par défaut, de sorte que chaque ressource possède son propre contrôleur et ses propres méthodes de création.Rendu de différentes actions de contrôleur dans Rails lors de l'utilisation de contrôleurs orientés ressources

Dans la vue /questions/show, je souhaite autoriser l'utilisateur à soumettre une réponse à la question en question. Le formulaire POST à ​​/answers, qui sera acheminé en tant que demande au AnswersController avec un appel à la méthode create.

Si la réponse a été créée, je peux simplement rediriger vers la question d'origine. Cependant, j'ai des problèmes avec les échecs de validation sur l'objet de réponse. Je dois afficher la vue /question/show et afficher les erreurs de validation pour l'objet de réponse. Ce n'est pas clair pour moi comment le faire le mieux.

Voici des exemples de ce à quoi pourraient ressembler les deux contrôleurs.

class AnswersController < ApplicationController 
    def create 
    @answer = Answer.new(params[:answer]) 
    if @answer.save 
     redirect_to @answer.question 
    else 
     # What should go here?? 
    end 
    end 
end 

class QuestionsController < ApplicationController 
    def show 
    @question = Question.find(params[:id]) 
    @answer = Answer.new(:question_id => @question.id) 
    end 
end 

ce qui devrait aller dans la clause else des de créer AnswersController méthode? Une redirection semble incorrecte, car l'erreur est réellement provoquée par la même requête. Appeler quelque chose comme render :template => 'questions/show' semble faux aussi, puisque je dois initialiser toutes les variables d'instance dont le modèle dépend. Ce style d'avoir des actions séparées pour appeler GET pour voir le formulaire de création d'un objet et appeler POST pour créer réellement l'objet semble bien fonctionner dans un contrôleur simple.

Comment cela peut-il être fait entre les contrôleurs?

Répondre

1

Essayez ceci pour la taille. Il redirige, mais repasse l'objet de réponse douteux plein d'erreurs.

class AnswersController < ApplicationController 
    def create 
    @answer = Answer.new(params[:answer]) 
    # stash the dodgy answer if it failed to save 
    session[:answer] = @answer unless @answer.save 
    redirect_to @answer.question 
    end 
end 

class QuestionsController < ApplicationController 
    def show 
    @question = Question.find(params[:id]) 
    # if we have one stashed in the session - grab it from there 
    # because it probably contains errors 
    @answer = session[:answer] || Answer.new(:question_id => @question.id) 
    end 
end 

Certains détails doivent ajouter (par exemple, l'effacer de la session lorsque vous avez terminé) etc