2010-05-06 6 views
1

J'ai 3 modèles: Questions, Réponses et Profils (je sais, ça devrait s'appeler "Utilisateurs"). Lorsque vous affichez une question Q, j'interroge la base de données pour les réponses à Q. (Ils sont liés par id.) Dans la vue, l'utilisateur actuel a la possibilité de supprimer sa réponse en cliquant sur le lien détruire à côté de sa réponse :Rediriger les utilisateurs après avoir détruit

%table 
    %tr 
    %td 
     Answers: 
    - @answers.each do |a| 
    %tr 
     %td 
     - @provider = Profile.find(a.provider) 
     %i 
      #{h @provider.username} said: 
     %br 
     #{h a.description} 
     %td 
     = link_to 'View full answer', a 
     %td 
     - if a.provider == @profile.id 
      #{link_to 'Delete my answer', a, :confirm => 'Are you sure?', :method => :delete} 

le problème est que lorsque l'utilisateur clique sur le lien détruire, il redirige la/réponses/index. Je veux qu'il redirige vers/questions/Q. Quelle est la meilleure façon de faire cela?

Je sais qu'il existe une méthode redirect_to, mais je ne sais pas comment l'implémenter lorsque je veux rediriger vers une action pour un autre contrôleur. Il doit également se souvenir de la question à partir de laquelle la réponse est supprimée.

J'ai essayé de faire passer quelque chose comme: question_id en link_to comme:

#{link_to 'Delete my answer', a, :confirm => 'Are you sure?', :question_id => @question.id, :method => :delete} 

En AnswersController # destroy:

def destroy 
    @answer = Answer.find(params[:id]) 
    @answer.destroy 

    respond_to do |format| 
     format.html { redirect_to(answers_url) } 
     format.xml { head :ok } 
    end 

    @question = Question.find(params[:question_id]) 
    redirect_to question_path(@question) 
    end 

Le: question_id informations ne sont pas transmises à la méthode destroy, donc je reçois ce erreur:

Couldn't find Question without an ID 

Pour confirmer, j'ai ajouté un appel puts avant Question.find, et il a renvoyé nil.

J'ai également essayé de stocker l'identifiant de la question dans les informations de session. AnswersController # détruit les modifications de la session d'appel [: question_id] au lieu de params [: question_id]. Mais, j'obtiens une erreur différente:

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return". 

Je ne suis pas sûr comment adresser est erreur. Où dois-je mettre le return?

Toute aide serait appréciée !!

+0

Est-réponse appartient à la question? –

+0

Une question peut avoir beaucoup de réponses. Cependant, je n'ai pas mis ces relations. Bon point! – user5243421

Répondre

4

Dans l'action qui définit le comportement de destruction, vous ajoutez simplement un redirect_to à la fin.

redirect_to peut utiliser l'une des vous des méthodes standard d'aide url/déroute:

Supposons que vous avez un contrôleur de questions et met en déroute et les actions associées, vous pouvez utiliser:

redirect_to question_path(@question) 

Dans le cas édité ci-dessus, Vous devez vous assurer que l'ID de question est correctement transmise:

link_to 'Supprimer ma réponse', answer_path (a,: question_id => @ question.id),: confirm => 'Êtes-vous sûr?',: method => : supprimer

Le second paramètre de link_to est l'URL en question. Vous pouvez vérifier le code HTML généré pour confirmer que les données sont en cours de rendu comme prévu.

Il y a aussi quelques autres options:

Selon la façon dont sont mis en place, vous pourrez peut-être vos routes et des relations pour faire répondre à un itinéraire imbriquée qui vit dans le contexte de la question. Ce qui vous donnerait un ensemble de help_answer_path helpers.

Si la réponse appartient à la question, vous pouvez réellement utiliser simplement answer.question_id dans la détruire l'action et sauver les tracas: P

+0

Hmm, j'ai essayé une version de cela, mais j'ai toujours la question de "sauver" et de reprendre la question en premier lieu. J'ai modifié ma question pour refléter cette information. Merci! – user5243421

+0

Ah, merci! Je vais devoir mettre en place ces relations. – user5243421