2012-04-24 3 views
1

У меня есть 2 модели:Вложенные ресурсы и довольно URLs

  1. Спорт
  2. Конкурс

В моей routes.rb я обычно делаю

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

Это дает мне URLs подобные /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 

Но это все. Я не знаю, как получить вложенный ресурс, или если я делаю что-то принципиально неправильное.

ответ

2

Позволяет первому сделать вложенные ресурсы, если вы действительно нуждаетесь в них, а затем заботиться о хорошеньких URLs:

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

# pretty urls: 
match "/show/:sport_name/:competition_name" => "competitions#show" 

Вам нужен «/ шоу» первым, так как в противном случае этот маршрут будет также маршрут любой другой маршрут (например, спорт/новый) до 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") 

Это должно привести к чему-то вроде "/шоу/спорт/соревнования».

Смежные вопросы