Tengo problemas para encaminar un formulario para una acción personalizada en Rails 3. Éstos son mis rutas:Rails 3 Formulario para la acción personalizada
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
put 'upload'
end
end
Aquí está la form_for:
form_for @photo, :remote => true, :url => { :action => upload_photo_path(@photo) }, :html => { :multipart => :true, :method => 'put' } do |f|
Y es aquí el mensaje de error:
No route matches {:action=>"/photos/42/upload", :controller=>"photos"}
... esto es especialmente frustrante porque "fotos /: id/carga" es exactamente la acción correcta para este formulario.
¿Qué me estoy perdiendo?
EDITS - Aquí están las rutas originales relacionados con la fotografía:
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"}
Estas son las rutas pertinentes cuando cambié la ruta a 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"}
desgracia 'partido' no funcionó mejor ...
- EDITAR -
Sólo para confirmar otro escenario aquí ... con esto en las rutas:
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
match 'upload'
end
end
y esto a la vista:
form_for @photo, :remote => true, :url => { :action => 'upload' }, :html => { :multipart => :true, :id => 'photo_upload' } do |f|
todavía me sale:
No route matches {:action=>"upload", :controller=>"photos"}
Puedo intentarlo más tarde, pero he decidido ir en una dirección completamente nueva. La razón para subir archivos a un miembro es que estaba creando, preparando y guardando cuando el usuario hace clic en 'nuevo', y en realidad están editando el registro a medida que completan la información por primera vez. Hice esto porque quiero poder guardar su progreso a medida que avanzan, y hay varios modelos asociados que necesitan el ID padre para guardar correctamente ... de todos modos, esto era demasiado doloroso, así que estoy intentando para llegar a un nuevo enfoque por completo. – Andrew
Bueno, para que lo sepas, si no hubieras utilizado el bit '{: action => ...}' - y hubieras hecho lo que sugerí arriba - hubieras tenido éxito. Lo que le estabas diciendo al generador de la url que generara era, de hecho, que querías publicar en una acción en tu controlador que se llamaba la salida de 'upload_photo_path (@photo)' - que ** en sí ** contiene el controlador y nombres de acción (como se puede ver en el error "No hay coincidencias de ruta ...") – davemyron
Ok, hice una prueba de esto para estar seguro, y tienes razón, esto creó la ruta como dijiste. No voy a usarlo de la misma manera (otros problemas con mi implementación), pero esta es una solución válida. Gracias :) – Andrew