Rails 3, La Forme De L'Action Personnalisée
Je vais avoir des problèmes de routage d'une forme à une action personnalisée dans Rails 3. Voici mon parcours:
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
put 'upload'
end
end
Voici la form_for:
form_for @photo, :remote => true, :url => { :action => upload_photo_path(@photo) }, :html => { :multipart => :true, :method => 'put' } do |f|
Et voici le message d'erreur:
No route matches {:action=>"/photos/42/upload", :controller=>"photos"}
... c'est particulièrement frustrant, car "photos/:id/upload" est exactement l'action correcte pour ce formulaire.
Ce qui me manque?
MODIFICATIONS - Voici l'original de la Photo routes:
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"}
Voici les routes quand j'ai changé l'itinéraire de 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"}
Malheureusement 'match' ne fonctionne pas mieux...
-- EDIT --
Juste pour confirmer un autre scénario ici... avec ce dans les routes:
resources :photos do
resources :comments
collection do
get 'update_states'
end
member do
match 'upload'
end
end
et ce de l'avis:
form_for @photo, :remote => true, :url => { :action => 'upload' }, :html => { :multipart => :true, :id => 'photo_upload' } do |f|
J'obtiens toujours:
No route matches {:action=>"upload", :controller=>"photos"}
OriginalL'auteur Andrew | 2011-01-15
Vous devez vous connecter pour publier un commentaire.
Que si vous l'avez fait juste
:url => upload_photo_path(@photo)
?Il semble un peu étrange que tu serais le téléchargement d'un membre. Est-ce juste une méthode de création (dans ce cas, vous devez juste POSTER à la collection chemin des)?
Eh bien tout simplement si vous le savez, si seulement tu n'avais pas utilisé la
{ :action => ... }
peu – et au lieu de cela fait ce que j'ai proposé ci – dessus vous avez réussi. Ce que vous disiez l'url de la génération de l'aide pour générer était, en fait, que vous voulais poster à une action sur votre contrôleur qui a été nommé à la sortie deupload_photo_path(@photo)
– lui-même contient le contrôleur et les noms d'action (comme vous pouvez le voir dans le "No route matchs..." d'erreur)Ok, j'ai fait un test de ce pour être sûr, et vous avez raison, ce n'créer le chemin d'accès que vous avez dit. Je ne vais pas l'utiliser de la même manière (d'autres problèmes avec ma mise en œuvre), mais c'est une solution valable. Merci 🙂
OriginalL'auteur
J'ai eu le même problème et, enfin, travaillé par le biais d'une solution que je ne suis pas sûr a été atteint dans le cas ci-dessus, depuis l'origine de l'affiche déplacé sur une autre approche.
Mes itinéraires avait
Et "râteau routes" inclus
Pourtant, j'ai gardé l'obtention de l'erreur
et le problème était limité à la forme générée par les Rails selon le ci-dessous form_for (remarque j'ai confirmé cela à l'aide de client HTTP manuellement POST à l'URL et vit qu'il s'agissait de trouver l'itinéraire)
J'ai vérifié la méthode, j'ai vérifié le chemin, tout avait l'air bon. Ce que j'ai finalement remarqué, à récurer le formulaire généré ligne par ligne:
Avis hidden input name="_method". Je souhaite le fait que les Rails a été l'interprétation de la présente comme une mise a montré dans les journaux, qui aurait fait mon débogage beaucoup plus vite. Je l'ai corrigé en disant à la forme explicite d'utiliser la méthode POST, qui, bien sûr, il était déjà, mais de dire ce qui a supprimé l'caché _method remplacer. Je suppose qu'une facette sur @compte, qui a déclenché les Rails de l'utilisation de la _method paramètre, mais @compte doit être un enregistrement existant.
match
au lieu depost
dans mes voies, il doit avoir travaillé de toute façon dans mon cas. Excellent ajout à cette question, bien que, comme je suis sûr que d'autres à trouver votre solution utile!OriginalL'auteur
Votre
url
paramètre doit être:url = > { : action => "télécharger" }
(Réponse d'origine)
Je parie que c'est parce que votre itinéraire s'attend à un
PUT
et votre forme est l'envoi d'unPOST
(probablement parce que@photo = Photo.new
). Vous avez plusieurs options:post 'upload'
form_for @photo, :as => :post
avec le reste de vos arguments@photo
est un enregistrement existant (par exemple, en appelantcreate
au lieu denew
)Le choix le plus approprié est probablement l'un des 2 premiers.
Essayez de programmer l'itinéraire pour
match 'upload'
. Aussi, après la sortie derake routes
.N'ont pas le fixer...
Le problème est dans votre
url
paramètre (voir la mise à jour de la réponse). Désolé de ne pas attraper tout de suite...C'est ce que je pensais aussi, mais peu importe la façon dont j'ai mis les routes que l'action me donne
No route matches {:action=>"upload", :controller=>"photos"}
OriginalL'auteur