2010-12-06 4 views
0

Quelque chose ne s'additionne pas sérieusement ici .. Ma page vient de rafraichir, rien ne se passe, elle ne touche jamais aucun de mes débogueurs traîner sur toutes mes méthodes sauf pour l'index.Comment le supprimer correctement?

mon html:

<%- for image in @images %> 
    <%= image.attachment_file_name %> 

    <%-# link_to_delete image, :url => destroy_image_admin_wysiwyg_path(image.id) %> 
    <%= link_to 'delete', { :url => destroy_image_image_path(image.id) }, 
     #:confirm => 'Are you sure?', 
     :post => true 
    %> 

    <br /> 
<% end %> 

mon contrôleur

def destroy_image 
    debugger 
    @img = Image.find(params[:id]) 
    @img.destroy 
    respond_to do |format| 
    format.html { redirect_to admin_image_rotator_path } 
    end 
end 

Mes itinéraires:

map.resources :images, :member => { :destroy_image => :post } 

Mon hack répugnant qui fonctionne que je vais remplacer dès que je trouve quelque chose de mieux

J'ai déplacé l'action sur un contrôleur plus simple, je me suis construit.

mes itinéraires à Changé:

admin.resources :wysiwygs, :member => { :destroy_image => :post } 

mon html Changé:

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image" %> 

Mais quand je clique sur le link..it fait monter l'action .. show ?? fffffffffuuuuuuu

Je riposté en déplaçant simplement mon action à l'action du spectacle, et passer un champ caché dans mon html ..

<%= link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :hidden_field => {:value => image.id} %> 

    def show 
    # this was previously in destroy_image 
    @img = Image.find(params[:hidden_field][:value]) 
    @img.destroy 
    respond_to do |format| 
     format.html { redirect_to admin_image_rotator_path } 
    end 
    end 
+0

Peut-être qu'un 'before_filter' empêche-t-il l'action d'être atteinte? En outre, c'est une approche inhabituelle - l'utilisation de GET pour supprimer est généralement considérée comme imprudente. – zetetic

+1

': post => true' ne semble pas correct. Avez-vous essayé ': method =>: post'? – zetetic

+0

Oui .. essayé. J'utilise spree et oui il y a une charge before_filter compliquée, donc j'ai essayé d'échanger avec certains de mes contrôleurs plus simples mais ça produit la même erreur. – Trip

Répondre

3

Il semble que vous vous trompez de chemin. Si un before_filter bloque votre action, comprendre pourquoi.Utilisez skip_before_filter :filter_name si le filtre n'est pas nécessaire.

N'utilisez pas les actions show ou HTTP GET pour les suppressions. Même si cela fonctionne, cela va perturber les choses. Utilisez un verbe SUPPRIMER:

map.resources :images, :member => { :destroy_image => :delete }

passe dans l'aide du lien:

<%= link_to "delete", destroy_image_image_path(image), :method => :delete %> 

Et utiliser ImagesController#destroy_image pour exécuter l'action. Mieux encore, pensez à utiliser le standard RESTful ImagesController#destroy que map.resources vous offre gratuitement.

0

Vous faites un POST, mais votre ressource dit que: destroy_image est disponible via GET. Essayez de changer votre itinéraire à:

map.resources :images, :member => { :destroy_image => :post } 

Aussi, jetez un oeil à votre link_to. Le deuxième paramètre prend une URL, pas un hachage qui a une clé: url. Comme mentionné ailleurs, en fonction de votre version de Rails, vous aurez besoin de :method => :post au lieu de :post => true. Dans Rails 2.3.8, vous voulez cette ligne à la place:

<%= link_to 'delete', destroy_image_image_path(image), :method => :post %> 
+0

Oui, bon point. Mais hélas, cela ne fait aucune différence. Il ne fait que rafraîchir. – Trip

+0

Votre lien_to pourrait être bizarre aussi. J'ai mis à jour la réponse avec plus de détails. Si cela ne fonctionne pas, je vous recommande d'essayer de boucler pour voir si vous pouvez accéder manuellement à cette URL. Si vous le pouvez, votre génération de lien est étrange. Sinon, c'est un problème avec votre before_filter. – cpm

+0

yikes..strange .. j'ai trouvé quelque chose qui fonctionne et posté ci-dessus, mais il me fait vomir dans ma bouche. si prudent de le lire. – Trip

1

Je ne sais pas ce qui se passait en premier lieu, mais dans votre seconde, la solution de travail, je pense que vous devriez écrire votre link_to comme suit:

link_to 'delete', :controller => "wysiwygs", :action => "destroy_image", :id => image.id  

Cela vous enverrait au moins à l'action correcte. Selon vos itinéraires, vous devrez faire un method => :post ou non. Vérifiez votre sortie rake routes, il va vous montrer quelles sont les routes possibles, et aussi quels noms ils ont obtenu, qui à son tour vous pouvez utiliser comme une méthode (ajouter _path ou _url à la fin). Ensuite, il devrait être encore plus facile d'écrire quelque chose comme:

link_to 'delete', wysiwygs_destroy_image_path(image) 

Bonne chance!

Questions connexes