Informazioni sul routing in Rails 3
-
25-09-2019 - |
Domanda
Credo che sto pensando di routing tutto sbagliato. Ho un molto semplice, due modelli di set-up: Prodotto e foto. has_many prodotto: foto, e foto belongs_to:. prodotto
Il prodotto ha un ponteggio completo mentre Photo ha una photos_controller che sto lavorando su.
In routes.rb abbiamo:
resources :products
(generato dal patibolo)
Come foto sono una risorsa nidificato di un prodotto che ha cambiato questo:
resources :products do
resources :photos
end
e infine
root :to => "products#index"
Fortunatamente rastrello rotte sputa fuori:
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"}
il che significa che la forma in prodotti / nuova volontà POST ai prodotti # creano che voglio quindi reindirizzare alle foto # nuovi e hanno un modulo per caricare i product_photos generati dal corrispondente foto / new.html.erb che posterò alle foto # crea, giusto?
in 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
ed in photos_controller.rb (per ora):
def new
@photo = Photo.new
end
Allora perché oh perché oh perché ottengo:
Routing Error
No route matches {:controller=>"photos", :action=>"new"}
quando rake routes chiaramente dice che fanno, ho un photos_controller, una nuova azione nel photos_controller e new_product_photo_path è chiaramente chiede di andare nel modo giusto? (Ho anche una foto / new.html.erb che ha una semplice <h1>Photos</h1>
di qualcosa da rendering).
posso solo concludere che sto pensando a questo tutto il modo sbagliato, o che ho fatto un errore nella convenzione sulla configurazione che non riesco a vedere.
Chiunque?
Grazie e Cordiali saluti, Adam
Soluzione
risposta Aggiornato:
Utilizzando un mezzo di risorse nidificati (in questo caso) che è possibile creare solo una nuova foto nel contesto di un prodotto. Ciò significa che l'applicazione è di sapere quale prodotto la foto deve essere creato appartiene.
Nel caso del vostro reindirizzamento Questo significa che dovete aggiungere il prodotto oggetto come parametro new_product_photo_path
:
redirect_to new_product_photo_path(@product)
risposta originale:
Questo è perché hai fatto una risorsa nidificato. /products/1/photos/new
probabilmente funziona. Se si vuole essere in grado di creare nuove foto via /photos/new
troppo, è necessario aggiungere una risorsa 'unnested' troppo.