>我有 2 个模型:
- 运动
- 竞争
在我的路由.rb中,我通常会这样做
resources :sports, :only => [:index, :show] do
resources :competitions, , :only => [:index, :show]
end
这给了我像/sports/1/competitions/4
这样的网址
但我想要的不是:controller/:id
,而是直接将:name
作为路径,就像/soccer/euro2012
我可以通过这样做获得第一部分:
match "/:sports_name" => "sports#show", :as => :sport
在我的控制器中:
def show
@sport = Sport.find_by_name(params[:sports_name])
end
但仅此而已。我不知道如何获取嵌套资源,或者我是否做了一些根本性错误的事情。
如果你真的需要的话,让我们先制作嵌套的资源,然后处理漂亮的网址:
# nested resources:
resources :sports, :only => [:index, :show] do
resources :competitions, , :only => [:index, :show]
end
# pretty urls:
match "/show/:sport_name/:competition_name" => "competitions#show"
您首先需要"/show",否则此路由也会将所有其他路由(如/sports/new)路由到competitions#show
。当然,您可以将其重命名为最适合您情况的名称。
现在,您可以通过params[:sport_name]
访问这项运动,并通过competitions#show
params[:competition_name]
访问比赛。
如果您希望 rails 为您生成路径,请在路由后附加一些代码:
match "/show/:sport_name/:competition_name" => "competitions#show", :as => "some_name"
并生成如下路径:
some_name_path( "sport", "competition" )
这应该会导致类似"/show/sport/competition"的内容。