2012-04-24 6 views
1

私は2つのモデルがあります:私のroutes.rbをでネストされたリソースとかなりのURL

  1. スポーツ
  2. 競争

を私は普通

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

だろうこれは私にURLを与えますlike /sports/1/competitions/4

しかし、私が欲しいのはとても/soccer/euro2012

のように私はこのことで最初の部分を取得することができ、:controller/:idされていませんが、パスとして直接:name

match "/:sports_name" => "sports#show", :as => :sport 

そして、私のコントローラで:

def show 
    @sport = Sport.find_by_name(params[:sports_name]) 
end 

しかしそれはそれです。入れ子にされたリソースをどうやって取得するのか、私が根本的に何か間違っていることを考えていない。

答えて

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" 

そうでない場合は、このルートは、ルートごとに他をもするので、あなたが最初の「/ショー」が必要経路(/ sports/newなど)をcompetitions#showに変更してください。もちろん、あなたの状況に最も適したものに名前を変更することができます。

params[:sport_name]params[:competition_name]での競技は、competitions#showでスポーツにアクセスできます。

あなたはレールがあなたのためにパスを生成する場合は、ルートにいくつかのコードを追加します。

match "/show/:sport_name/:competition_name" => "competitions#show", :as => "some_name" 

と、このようなパスを生成します。

some_name_path("sport", "competition") 

をこれは "のようなものになるはずです/ show/sport/competition "を参照してください。

関連する問題