Rails中如何重写默认RESTful路由的方法

5

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映射的默认HTTP方法更改为使用PUT方法,而不是现在的{:controller=>"users", :action=>"create"}

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个回答

2
您可以明确添加一条路由来接受 /users 的 PUT 请求以创建用户,但它不会替换现有的 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"}

但我很感激你对此非常详细的问题所提出的疑问!

这基本上是我到目前为止所做的来解决它,希望我可以不需要额外的路由,只需更改使用map.resources创建的路由所使用的方法。 - John Duff

1

定义

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

将其做给:users。 我不确定是否有类似于动作控制器中的方法名称的默认覆盖:

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

这可能是你一直在问的问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接