Rails 3:将“通用”控制器路由与标准资源路由混合

时间:2012-07-16 14:13:46

标签: ruby-on-rails-3 routes

我有一组看起来像这样的路线:

resources :placements do
  match '/foo' => "placements#foo"
  match '/bar' => "placements#bar"
end

这会产生与您期望的行为相符的路线:

/placements/1234/foo
/placements/1234/bar

但是,对于一些不需要单独放置的方法,我也需要“通用”路由。所以,我构建了一个如下所示的路由块:

resources :placements do
  match '/foo' => "placements#foo"
  match '/bar' => "placements#bar"
end
match '/placements/baz' => "placements#baz"

如果我rake routes,我会得到一条看起来不错的路线:

/placements/baz

注意缺少id。但是,如果我尝试访问该路由,Rails会尝试在控制器上调用show方法,就好像“baz”是ID,而不是方法名称。我如何构建一个路由结构,让我能够获得我所追求的内容,而不必将路由的第一段(placements)更改为其他内容?

1 个答案:

答案 0 :(得分:1)

将第二条路线移到resources区块上,即

match '/placements/baz' => "placements#baz"
resources :placements, :id => /\d+/ do
  match '/foo' => "placements#foo"
  match '/bar' => "placements#bar"
end

或为id中的resources添加正则表达式,例如:

resources :placements, :id => /\d+/ do
  match '/foo' => "placements#foo"
  match '/bar' => "placements#bar"
end
match '/placements/baz' => "placements#baz"
相关问题