Rails路由 - 覆盖http动词

时间:2015-03-13 22:05:29

标签: ruby-on-rails routes

我正在尝试使用resources生成以下五条路线:

      Prefix Verb URI Pattern                     Controller#Action
       lists GET  /lists(.:format)                lists#index
 create_list GET  /lists/create(.:format)         lists#create
        list GET  /lists/:id(.:format)            lists#show
destroy_list GET  /lists/:id/destroy(.:format)    lists#destroy
 update_list GET  /lists/:id/update(.:format)     lists#update

请注意,所有请求都需要是GET请求。我只是将操作类型附加到URL,而不是使用补丁,发布和删除。我需要这个能够使用websockets(websockets只能执行GET请求)。

以下是我的尝试:

resources :lists, only: [:index, :show] do
  collection do
    get :create # should route to /lists/create, but routes to /lists
  end

  member do
    get :update # should route to /lists/:id/update, but routes to /lists/:id
    get :destroy # should route to /lists/:id/destroy, but routes to /lists/:id
  end
end

这导致以下结果:

Prefix Verb URI Pattern          Controller#Action
lists  GET  /lists(.:format)     lists#create
 list  GET  /lists/:id(.:format) lists#update
       GET  /lists/:id(.:format) lists#destroy
       GET  /lists(.:format)     lists#index
       GET  /lists/:id(.:format) lists#show

这里的问题是它似乎拒绝了关键字:create:update:destroy,可能是因为它知道我正在尝试做一些非常规的事情。

我知道我可以用不同的路线写get五次,但我想使用resources以便我可以嵌套路线等。

如何使用resource

从此问题的顶部获取五条路线?

1 个答案:

答案 0 :(得分:2)

嗯,显而易见的答案是使用字符串而不是符号。

resources :lists, only: [:index, :show] do
  collection do
    get 'create', as: 'create'
  end

  member do
    get 'update', as: 'update' 
    get 'destroy', as: 'destroy' 
  end
end

但我有一个不同的问题作为回报。在这种情况下,你会忽略REST的问题/特征/奇怪的道路/等等是什么?