我有2个型号:
在我的routes.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
但那是关于它的。我不知道如何获取嵌套资源,或者我是否正在做一些根本错误的事情。
答案 0 :(得分:2)
让我们首先制作嵌套资源,如果你真的需要它们,然后处理漂亮的网址:
# 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]
通过params[:competition_name]
中的competitions#show
参加比赛了。
如果您希望rails为您生成路径,请在路径中附加一些代码:
match "/show/:sport_name/:competition_name" => "competitions#show", :as => "some_name"
并生成如下路径:
some_name_path( "sport", "competition" )
这应该会产生类似“/ show / sport / competition”的内容。