Ho problemi di routing di un modulo per un'azione personalizzata in Rails 3. Qui sono le mie vie:Rails 3 Modulo di azione personalizzata
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
put 'upload'
end
end
Ecco il form_for:
form_for @photo, :remote => true, :url => { :action => upload_photo_path(@photo) }, :html => { :multipart => :true, :method => 'put' } do |f|
Ed ecco il messaggio di errore:
No route matches {:action=>"/photos/42/upload", :controller=>"photos"}
... questo è particolarmente frustrante perché "foto /: id/upload" è esattamente l'azione corretta per questo modulo.
Cosa mi manca?
EDITS - Ecco le Foto originale legate percorsi:
photo_comments GET /photos/:photo_id/comments(.:format) {:action=>"index", :controller=>"comments"}
POST /photos/:photo_id/comments(.:format) {:action=>"create", :controller=>"comments"}
new_photo_comment GET /photos/:photo_id/comments/new(.:format) {:action=>"new", :controller=>"comments"}
edit_photo_comment GET /photos/:photo_id/comments/:id/edit(.:format) {:action=>"edit", :controller=>"comments"}
photo_comment GET /photos/:photo_id/comments/:id(.:format) {:action=>"show", :controller=>"comments"}
PUT /photos/:photo_id/comments/:id(.:format) {:action=>"update", :controller=>"comments"}
DELETE /photos/:photo_id/comments/:id(.:format) {:action=>"destroy", :controller=>"comments"}
update_states_photos GET /photos/update_states(.:format) {:action=>"update_states", :controller=>"photos"}
upload_photo PUT /photos/:id/upload(.:format) {:action=>"upload", :controller=>"photos"}
photos GET /photos(.:format) {:action=>"index", :controller=>"photos"}
POST /photos(.:format) {:action=>"create", :controller=>"photos"}
new_photo GET /photos/new(.:format) {:action=>"new", :controller=>"photos"}
edit_photo GET /photos/:id/edit(.:format) {:action=>"edit", :controller=>"photos"}
photo GET /photos/:id(.:format) {:action=>"show", :controller=>"photos"}
PUT /photos/:id(.:format) {:action=>"update", :controller=>"photos"}
DELETE /photos/:id(.:format) {:action=>"destroy", :controller=>"photos"}
Ecco relative rotte quando ho cambiato il percorso per match 'upload'
:
photo_comments GET /photos/:photo_id/comments(.:format) {:action=>"index", :controller=>"comments"}
POST /photos/:photo_id/comments(.:format) {:action=>"create", :controller=>"comments"}
}
new_photo_comment GET /photos/:photo_id/comments/new(.:format) {:action=>"new", :controller=>"comments"}
edit_photo_comment GET /photos/:photo_id/comments/:id/edit(.:format) {:action=>"edit", :controller=>"comments"}
photo_comment GET /photos/:photo_id/comments/:id(.:format) {:action=>"show", :controller=>"comments"}
PUT /photos/:photo_id/comments/:id(.:format) {:action=>"update", :controller=>"comments"}
DELETE /photos/:photo_id/comments/:id(.:format) {:action=>"destroy", :controller=>"comments"}
update_states_photos GET /photos/update_states(.:format) {:action=>"update_states", :controller=>"photos"}
upload_photo /photos/:id/upload(.:format) {:action=>"upload", :controller=>"photos"}
photos GET /photos(.:format) {:action=>"index", :controller=>"photos"}
POST /photos(.:format) {:action=>"create", :controller=>"photos"}
new_photo GET /photos/new(.:format) {:action=>"new", :controller=>"photos"}
edit_photo GET /photos/:id/edit(.:format) {:action=>"edit", :controller=>"photos"}
photo GET /photos/:id(.:format) {:action=>"show", :controller=>"photos"}
PUT /photos/:id(.:format) {:action=>"update", :controller=>"photos"}
DELETE /photos/:id(.:format) {:action=>"destroy", :controller=>"photos"}
Purtroppo 'match' non ha funzionato meglio ...
- EDIT -
Solo per confermare un altro scenario qui ... con questo negli itinerari:
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
match 'upload'
end
end
e questo nella vista:
form_for @photo, :remote => true, :url => { :action => 'upload' }, :html => { :multipart => :true, :id => 'photo_upload' } do |f|
ho ancora ottenere:
No route matches {:action=>"upload", :controller=>"photos"}
Potrei provarci più tardi, ma ho deciso di andare in una direzione completamente nuova. Il motivo per il caricamento su un membro è che stavo creando, preparando e salvando quando l'utente fa clic su "nuovo", quindi in realtà stanno modificando il record mentre riempiono le informazioni per la prima volta. L'ho fatto perché voglio essere in grado di salvare i loro progressi mentre vanno, e ci sono diversi modelli associati che hanno bisogno dell'ID genitore per poter salvare correttamente .... comunque, questo era troppo dolore, quindi sto provando per elaborare un nuovo approccio interamente. – Andrew
Beh, solo per quello che sai, se solo non avessi usato il bit '{: action => ...}' - e invece avessi fatto quello che ho suggerito sopra - avresti avuto successo. Quello che stavi dicendo che l'helper della generazione di url per generare era, infatti, che volevi postare su un'azione sul controller che si chiamava l'output di 'upload_photo_path (@photo)' - che ** stesso ** contiene il controller e nomi di azioni (come puoi vedere nell'errore "Nessuna corrispondenza corrisponde ...") – davemyron
Ok, ho fatto un test di questo per essere sicuro, e hai ragione, questo ha creato il percorso come hai detto tu. Non lo userò più allo stesso modo (altri problemi con la mia implementazione), ma questa è una soluzione valida. Grazie :) – Andrew