在Rails 3中限制资源路由并添加额外的非RESTful路由

9

我无法在这里或其他地方找到任何涵盖Rails 3中限制资源路由和添加额外的非RESTful路由的内容。这可能很简单,但我遇到的每个例子或解释都只涉及一个案例而不是同时解决两个问题。

以下是我在Rails 2中所做的示例:

map.resources :sessions, :only => [:new, :create, :destroy], :member => {:recovery => :get}

非常直观,我们只想要7个RESTful路由中的3个,因为其他的对于这个资源没有意义,但我们还想添加另一条用于账户恢复的路由。

现在,从我所了解的情况来看,这两件事情都非常简单:

resources :sessions, :only => [:new, :create, :destroy]

就像在Rails 2中一样。和:

resources :sessions do
  member do
    get :recovery
  end
end

那么,我该如何将这两个东西结合起来呢?我还能使用旧的Rails 2方法吗?在Rails 3中有没有更好的方法来实现这个目标?

2个回答

17

你可以向 resources 传递参数和一个块:

resources :sessions, :only => [:new, :create, :destroy] do
  get :recovery, :on => :member
end

然后使用rake routes测试一下。


我的 routes.rb 文件声明了 resources :thing, :only => [:show] do get :foo, :on => :member end,并且运行 rake routes 命令后会得到 foo_thing GET /thing/foo(.:format) thing#foothing GET /thing(.:format) thing#show 两个路由。虽然链接到 thing 的页面可以正常访问,但是如果代码中导航到 foo_thing 链接时,我会收到一个 Rails "Routing Error" 错误页面,上面显示 No route matches [GET] "/foo_thing",但是如果我在 URL 地址栏中输入 .../thing/foo,则可以正常访问。如果 routes.rb 文件中有一行 get 'foo_thing' => 'thing#foo',那么代码中的 foo_thing 路径才能正常工作。请问我做错了什么? - Teemu Leisti
我对上面的问题进行了扩展,并编写了这个问题,如果您有答案,请前去回答。谢谢。 - Teemu Leisti

5
它应该基本上像这样运作
resources :sessions, :only => [:new, :create, :destroy] do
  member do
    get :recovery
  end
end

有一种更短的方法,由coreyward提出。

请查看Rails指南中的“从外到内的Rails路由”。 我还推荐Obie Fernandez的《Rails 3之道》,其中有两个非常好的章节介绍Routing和RESt。

干杯


你在“resources”单词上打错了一个字母。 ;) - coreyward
在第一行末尾的 do 前面移除逗号,这样就正确了。 - Matt Huggins

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