1

私は2つのモデルを持っています:

  1. スポーツ
  2. コンペ

私のroutes.rbでは、通常はそうします

resources :sports, :only => [:index, :show] do
  resources :competitions, , :only => [:index, :show]
end

これにより、次のようなURLが得られます/sports/1/competitions/4

しかし、私が欲しいのはNOT :controller/:idですが、直接:nameas パスです。/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です。もちろん、これを状況に最も適した名前に変更できます。

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 に答える