2010-12-09 6 views
3

Je rencontre des problèmes avec ma méthode de destruction sur un produit source imbriqué, lié à des commandes. Après la tentative de destruction d'un élément, je redirige les utilisateurs vers mon produit order_products_url. Je reçois l'erreur de routage suivant:Rails 3 - Ressources imbriquées - Routage

No route matches "/orders/1/products" 

Ma méthode destroy ressemble à ceci:

def destroy 
    @product = Product.find(params[:id]) 
    @order = Order.find(params[:order_id]) 
    @product.destroy 

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

Et routes.rb:

resources :orders do 
    resources :products, :controller => "products"  
    end 

La raison pour laquelle cela me source de confusion, est Pour ma méthode de mise à jour des produits, je redirige correctement les utilisateurs vers order_products_url sans problème. Je ne comprends pas pourquoi ça marche mais pas ici.

Merci

Répondre

8

order_products_url attend qu'un paramètre soit transmis - soit l'identifiant de la commande, soit l'objet de la commande lui-même. Sans cela, cela ne fonctionnera pas correctement. Donc, en utilisant votre code ci-dessus:

def destroy 
    @product = Product.find(params[:id]) 
    @order = Order.find(params[:order_id]) 
    @product.destroy 

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

Comme une note de côté, vous pouvez réduire vos itinéraires un peu:

resources :orders do 
    resources :products 
end 

Spécification du contrôleur est redondant quand il est nommé Rails attend. J'espère que ça aide!

MISE À JOUR: J'ai ajouté un lien vers mon article sur le routage dans Rails 3, avec des exemples de code téléchargeables. Je mis à jour avec un paragraphe qui explique les routes nommées, dans les « choses que vous devez savoir » section:

Routing in Ruby on Rails 3

+0

Doux, merci pour l'aide.Après avoir corrigé cela, j'ai trouvé un problème avec ma vue, où je l'ai maintenant corrigé en utilisant une méthode delete sur mon order_product_path plutôt qu'avant où j'essayais de supprimer seulement mon @product. J'apprécie l'aide, je le fais vraiment. – Kombo

+0

Je suis content que ça a aidé! Si vous voulez plus d'informations, j'ai ajouté un lien vers un article de blog que j'ai fait il y a quelques temps. Bonne chance! –

+0

Notez également que vous incluez @order dans la route de redirection - order_products_url (@order) - car vous devez indiquer à Rails l'index de produit spécifique que vous souhaitez afficher (c'est-à-dire l'index des produits imbriqués dans cet ordre spécifique, pas un autre ordre). – Ethan

3

Ne vous devez rediriger vers order_products_url (@Order)?

1

vous devriez utiliser orer_products_path (pas l'URL). Si vous allez à la racine de votre application et tapez,

rake routes 

qui vous donnera une liste de toutes les routes nommées. Vous devez cependant ajouter _path à (renvoie la représentation de chaîne). C'est un petit truc pratique pour déterminer les routes nommées.

Maintenant à votre vraie question - bien sûr, il n'existe pas! Vous venez de le supprimer! Vous détruisez le produit au lieu du produit de la commande!

+0

Les deux suffixes (_PATH et _url) travaillent dans ce cas, il est le paramètre manquant qui est l'origine du problème . –

+0

bizarre. _url ne fonctionne pas pour moi du tout (juste essayé) – sethvargo

+0

Hey Seth, merci pour aider. rake routes m'a beaucoup aidé à résoudre un autre problème que j'ai créé une fois que j'ai trouvé mon problème de ne pas passer un argument (doh). Pour un test, j'ai essayé d'utiliser à la fois _path et _url - les deux ont fonctionné. Je suis juste curieux de savoir quelle est la différence entre les deux? – Kombo