2010-07-07 5 views
1

J'essaie de router seulement un verbe http. Dire que j'ai des commentaires ressources comme ceci:Routage des verbes HTTP dans Rails

map.resources :comments 

et je voudrais être en mesure de détruire tous les commentaires en envoyant une demande DELETE /comments. C'est à dire. Je veux pouvoir mapper uniquement le verbe http sans la partie "nom de l'action" de la route. Est-ce possible?

Vive

Répondre

2

Vous pouvez le faire:

map.resources :comments, :only => :destroy 

qui produit une route comme celle-ci (vous pouvez vérifier avec rake routes)

DELETE /comments/:id(.:format) {:controller=>"comments", :action=>"destroy"} 

Mais notez que la RESTful détruire est conçu pour enlever un spécifique enregistrer non all r ecords donc cette route attend encore un paramètre: id. Un hack pourrait être de passer une valeur sentinelle pour: id représentant "all" dans votre contexte d'application. Par contre, si vos commentaires appartiennent à un autre modèle, la suppression de l'autre modèle devrait également supprimer les commentaires. C'est classiquement comment les suppressions de rangée multiples pourraient normalement se produire.

+0

La ressource de commentaires dans ce cas était de fiction ^^ Il devrait vraiment être une façon de faire, tout comme la valeur par défaut « supprimer » la route ne ... –

1

Comme il ne s'agit pas d'une action RESTful standard, vous devez utiliser une route personnalisée.

map.connect '/comments', 
    :controller => 'comments', 
    :action => "destroy_all", 
    :conditions => { :method => :delete } 

Dans votre contrôleur:

class CommentsController < ApplicationController 
    # your RESTful actions here 

    def destroy_all 
    # destroy all your comments here 
    end 
end 

Vu, invoquer comme ceci:

<%= link_to "delete all comments", 
     comments_path, 
     :method => :delete, 
     :confirm => "Are you sure" %> 

ps. Je n'ai pas testé ce code, mais je pense que ça devrait marcher.

+0

ne serait pas cette action mieux être ajouté avec juste un map.resources: comments,: collection => {: destroy_all =>: delete} J'ai l'impression que SUPPRIMER à la ressource de collection serait plus 'RESTful' ... Merci pour votre réponse :) –

+1

L'utilisation de l'attribut: collection génère l'URL sous la forme/messages/delete_all et selon la question n'est pas souhaitable. –