1 votes

Redirection des utilisateurs après destruction

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

%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 "destroy", il est redirigé vers le site /answers/index. Je veux qu'il soit redirigé vers /questions/Q. Quelle est la meilleure façon de procéder ?

Je sais qu'il y a un redirect_to mais je ne sais pas comment l'implémenter lorsque je veux rediriger vers une action pour un contrôleur différent. Il doit également se souvenir de la question dont la réponse est supprimée.

J'ai essayé de passer quelque chose comme :question_id dans link_to as :

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

Dans 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

L'information :question_id n'est pas transmise à la méthode de destruction, et j'obtiens donc cette erreur :

Couldn't find Question without an ID

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

J'ai également essayé de stocker l'identifiant de la question dans les informations de la session. AnswersController#destroy change pour appeler session[: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 de savoir comment résoudre cette erreur. Où dois-je mettre le return ?

Toute aide serait appréciée !

4voto

Toby Hede Points 22128

Dans l'action qui définit le comportement de destruction, il suffit d'ajouter une redirect_to à l'achèvement.

redirect_to peut utiliser n'importe quelle méthode d'aide url/rout standard :

En supposant que vous disposez d'un contrôleur de questions et des routines et actions associées, vous pourriez utiliser :

redirect_to question_path(@question)

Dans le cas édité ci-dessus, vous devez vous assurer que le question_id est transmis correctement :

link_to 'Supprimer ma réponse', answer_path(a, :question_id => @question.id), :confirm => 'Are you sure?', :method => :delete

Le deuxième paramètre de link_to est l'URL en question. Vous pouvez vérifier le HTML généré pour confirmer que les données sont rendues comme vous le souhaitez.

Il y a aussi d'autres options ici :

En fonction de la façon dont vos routes et vos relations sont configurées, vous pouvez peut-être faire de Answer une route imbriquée qui vit à l'intérieur du contexte Question. Ce qui vous donnerait un ensemble d'aides question_answer_path.

Si la réponse appartient à la question, vous pourriez en fait utiliser answer.question_id dans l'action de destruction et vous épargner des tracas :P

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X