Rails中默认RESTFUL路由的覆盖方法

时间:2010-08-17 20:33:01

标签: ruby-on-rails rest resources routing

routes.rb

中给出类似下面的行
map.resources :users

生成的路线可能是这样的:

      users GET    /users(.:format)           {:controller=>"users", :action=>"index"}
            POST   /users(.:format)           {:controller=>"users", :action=>"create"}
   new_user GET    /users/new(.:format)       {:controller=>"users", :action=>"new"}
  edit_user GET    /users/:id/edit(.:format)  {:controller=>"users", :action=>"edit"}
       user GET    /users/:id(.:format)       {:controller=>"users", :action=>"show"}
            PUT    /users/:id(.:format)       {:controller=>"users", :action=>"update"}
            DELETE /users/:id(.:format)       {:controller=>"users", :action=>"destroy"}

有没有办法将POST /users映射到{:controller=>"users", :action=>"create"}的默认HTTP方法更改为用于PUT的HTTP方法?

rake routes会生成如下内容:

      users GET    /users(.:format)           {:controller=>"users", :action=>"index"}
            PUT    /users(.:format)           {:controller=>"users", :action=>"create"}
   new_user GET    /users/new(.:format)       {:controller=>"users", :action=>"new"}
  edit_user GET    /users/:id/edit(.:format)  {:controller=>"users", :action=>"edit"}
       user GET    /users/:id(.:format)       {:controller=>"users", :action=>"show"}
            PUT    /users/:id(.:format)       {:controller=>"users", :action=>"update"}
            DELETE /users/:id(.:format)       {:controller=>"users", :action=>"destroy"}

我知道这对于RESTful路由是不正确的,我只是想知道是否可以更改这些路由使用的HTTP方法。

2 个答案:

答案 0 :(得分:2)

您可以显式添加路由以接受带有PUT的/users来创建用户,但它不会替换现有的POST路由。

map.connect '/users(.:format)', 
   :controller => 'users', 
   :action => 'create', 
   :conditions => { :method => :put }

您还可以添加:member => { :create => :put }添加create_users PUT /users/create(.:format) {:action=>"create", :controller=>"users"} 来创建用户的新路线,这将产生如下路线:

{{1}}

但我很欣赏这并不能完全解决你所要求的问题!

答案 1 :(得分:1)

定义

map.resources :users, :member =>{:create => :put}

将为:users执行此操作。我不确定默认覆盖,比如动作控制器中的方法名称,如:

config.action_controller.resources_path_names = { :new => "create", 
        :edit => "change" }

您可能一直在问这个问题。