Ситуация с простой маршрутизацией Rails - PullRequest
4 голосов
/ 23 января 2009

Я создаю приложение Ruby on Rails, которое состоит из историй. Каждая история имеет несколько страниц.

Как мне настроить route.rb, чтобы у меня могли быть такие URL-адреса:

http://mysite.com/[story id]/[page id]

Как:

http://mysite.com/29/46

В настоящее время я использую такую ​​настройку:

http://mysite.com/stories/29/pages/46

Использование:

ActionController::Routing::Routes.draw do |map|

  map.resources :stories, :has_many => :pages
  map.resources :pages

  map.root :controller => "stories", :action => "index"

  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'

end

Заранее спасибо. Я новичок в Rails, и маршрутизация сейчас кажется мне немного сложной.

Ответы [ 3 ]

6 голосов
/ 23 января 2009

Вот хороший ресурс.

map.connect 'stories/:story_id/:page_num', :controller => "stories", :action => "index", :page_id => nil

В вашем контроллере:

def index
  story = Story.find(params[:story_id])
  @page = story.pages[params[:page_num]]
end

ОБНОВЛЕНИЕ: только что заметил, что вы не хотите, чтобы «истории» появлялись Не уверен, что удаление этого из map.connect сработает ... попробуйте.

map.connect '/:story_id/:page_num', ...
1 голос
/ 23 января 2009

Я не уверен, почему никто не предложил просто использовать именованный маршрут. Что-то вроде

map.story '/:story_id/:page_id', :controller => 'stories', :action => 'show'

тогда вы могли бы просто позвонить с

story_path(story.id,params[:page}) 

или что-то подобное.

1 голос
/ 23 января 2009

с учетом маршрута

map.connect '/:story_id/:id', :controller => 'pages', :action => 'show'

Вы можете сделать это в вашем контроллере

def show
  @story = Story.find(:story_id)
  @page = @story.pages.find(:id)
end

Теперь вы можете получить страницу, используя идентификатор истории.

PS: map.connect ':story_id/:id' должен работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...