1

我有 2 个模型:

  1. 运动
  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

但仅此而已。我不知道如何获取嵌套资源,或者我是否在做一些根本错误的事情。

4

1 回答 1

2

让我们首先制作嵌套资源,如果你真的需要它们,然后处理漂亮的 url:

# 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. 当然,您可以将其重命名为最适合您情况的名称。

现在您可以通过in访问运动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”的结果。

于 2012-04-24T11:08:15.177 回答