在Rails中覆盖“show”资源路由

时间:2012-09-02 11:47:22

标签: ruby ruby-on-rails-3.2

resources :some_resource

即,有一条路线/some_resource/:id

事实上,:id的{​​{1}}将始终存储在会话中,因此我希望使用some_resource覆盖路径/some_resource/:id。或者我想用/some_resource/my覆盖它,并删除路径GET /some_resource/以进行索引操作。

我如何实现这两个目标?

2 个答案:

答案 0 :(得分:14)

在您的routes.rb中:

get "some_resource" => "some_resource#show"
在行 之前

resources :some_resource

然后rails会在找到资源之前拿起你的“get”...从而覆盖get / some_resource

此外,您应指定:

resources :some_resource, :except => :index

虽然,如上所述,rails不会捡起来,这是一个很好的做法

答案 1 :(得分:9)

Chen's answer工作正常(我使用该方法已有一段时间了),但有一种标准化的方法。在Official Rails Guides中,首选使用收集路线

存在收集路由,因此Rails不会假定您正在指定资源:id。在我看来,这比在routes.rb文件中使用优先级覆盖路由更好。

resources :some_resource, :except => :index do
  get 'some_resource', :on => :collection, :action => 'show'
end

如果您需要指定多个收集路线,则首选使用该块。

resources :some_resource, :except => :index do
  collection do
    get 'some_resource', :action => 'show'
    # more actions...
  end
end