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