Présentation du routage dans Rails 3
-
25-09-2019 - |
Question
Je pense que je pense à tout faux routage. J'ai un set-up très simple, deux modèles: Produit et Photo. has_many du produit: photos, photo belongs_to. produit
a produit un échafaudage complet en photo a une photos_controller que je travaille.
En routes.rb nous avons:
resources :products
(généré par l'échafaud)
Comme les photos sont une ressource imbriquée d'un produit que je change cela:
resources :products do
resources :photos
end
et enfin:
root :to => "products#index"
râteau Heureusement routes crache:
products GET {:controller=>"products", :action=>"index"}
products POST {:controller=>"products", :action=>"create"}
new_product GET {:controller=>"products", :action=>"new"}
edit_product GET {:controller=>"products", :action=>"edit"}
product GET {:controller=>"products", :action=>"show"}
product PUT {:controller=>"products", :action=>"update"}
product DELETE {:controller=>"products", :action=>"destroy"}
product_photos GET {:controller=>"photos", :action=>"index"}
product_photos POST {:controller=>"photos", :action=>"create"}
new_product_photo GET {:controller=>"photos", :action=>"new"}
edit_product_photo GET {:controller=>"photos", :action=>"edit"}
product_photo GET {:controller=>"photos", :action=>"show"}
product_photo PUT {:controller=>"photos", :action=>"update"}
product_photo DELETE {:controller=>"photos", :action=>"destroy"}
products GET {:controller=>"products", :action=>"index"}
products POST {:controller=>"products", :action=>"create"}
new_product GET {:controller=>"products", :action=>"new"}
edit_product GET {:controller=>"products", :action=>"edit"}
product GET {:controller=>"products", :action=>"show"}
product PUT {:controller=>"products", :action=>"update"}
product DELETE {:controller=>"products", :action=>"destroy"}
root {:controller=>"products", :action=>"index"}
ce qui signifie que la forme de produits / nouveaux produits livrons dans le # créer que je veux rediriger ensuite les photos # nouvelles et un formulaire pour télécharger les product_photos générés par les photos correspondantes / new.html.erb qui POST aux photos # créer, droit?
product_controller.rb:
def create
@product = Product.new(params[:product])
respond_to do |format|
if @product.save
redirect_to new_product_photo_path, :notice => 'Product was successfully created.'
else
render :action => "new"
end
end
end
et photos_controller.rb (pour l'instant):
def new
@photo = Photo.new
end
Alors, pourquoi oh pourquoi, oh pourquoi dois-je obtenir:
Routing Error
No route matches {:controller=>"photos", :action=>"new"}
lorsque les routes de râteau est clairement dit que je fais, j'ai photos_controller, une nouvelle action dans le photos_controller et new_product_photo_path demande clairement d'aller dans le bon sens? (J'ai aussi des photos / new.html.erb qui a simple <h1>Photos</h1>
quelque chose à rendre).
Je ne peux conclure que je pense à tout cela dans le mauvais sens, ou que je l'ai fait une erreur dans la convention sur la configuration que je ne vois pas.
Tout le monde?
Merci et Cordialement, Adam
La solution
Réponse Mise à jour:
En utilisant un moyen de ressources imbriqués (dans ce cas) que vous ne pouvez créer une nouvelle photo dans le contexte d'un produit. Cela signifie que l'application doit savoir quel produit la photo à créer appartient.
Dans le cas de votre redirect cela signifie que vous devez ajouter l'objet produit en tant que paramètre new_product_photo_path
:
redirect_to new_product_photo_path(@product)
Réponse d'origine:
Ceci est parce que vous l'avez fait une ressource imbriquée. /products/1/photos/new
ne fonctionne probablement. Si vous voulez être en mesure de créer de nouvelles photos via /photos/new
aussi, vous devez ajouter une ressource « non imbriquées » aussi.