2014-03-09 5 views
1

У меня есть приложение с онлайн-тренингами, и каждое онлайн-обучение имеет несколько глав. Я не хочу создавать следующий контроллер только для учебных разделов. Я хочу иметь новые действия в TrainingsController, которые можно назвать главой. Тогда я хочу URL, как это:Rails 3 - новый маршрут действия контроллера

/тренинги/1/глава/3

(/ контроллер/идентификатор обучения/действие/идентификатор главы)

Не могли бы вы помочь мне, как я могу установить routes.rb для достижения такого поведения? Я много пробовал, но он все еще сломан.

Спасибо заранее!

Петр

ответ

3

Вы можете определить маршрут как:

resources :trainings do 
    get 'chapter/:chapter_id', action: :chapter, as: :training_chapter, constraints: { chapter_id: /\d+/ } 
end 

Затем в trainings_controller.rb:

def chapter 
    # params[:chapter_id] 
    ... 
end 

Линия get 'chapter/:chapter_id', action: :chapter, as: training_chapter, constraints: { chapter_id: /\d+/ }, определяет get маршрут формата training/:id/chapter/:chapter_id который выполняет chapter действие в TrainingController.

Название этого маршрута: , определяемое as: :training_chapter, поэтому вы можете использовать именованные маршруты, такие как training_chapter_trainings_path.

Окончательный вариант constraints: /\d+/ ограничивает значения, которые может содержать chapter_id, на основе которого выполняется этот маршрут. Таким образом, запрос получения к /trainings/1/chapter/1 выполняет действие chapter, тогда как /trainings/1/chapter/a не потому, что значение a для chapter_id не является цифрой.

1

Я думаю, что здесь есть то, что вы ищете:

match '/trainings/:training_id/chapter/:chapter_id' => 'trainings#chapter', :as => 'chapter_training' 

приложение/контроллеры/trainings_controller.rb

def chapter 
end 
Смежные вопросы