Создание собственного маршрута Rails - PullRequest
2 голосов
/ 13 января 2010

Я пытаюсь создать собственный маршрут в рельсах и не уверен, правильно ли я иду по этому пути. Во-первых, у меня есть ресурс RESTful для тайников, который перенаправляет на mystash как контроллер:

map.resources :stashes, :as => 'mystash'
site.com/mystash goes to :controller => 'stashes', :action => 'show'

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

site.com / mystash / ZoomOut / новый / quiz_on /

У меня есть места в маршрутах:

map.connect 'mystash/:zoom/:nav_option/:quiz',
            :controller => 'stashes',
            :action => 'show'    
map.connect 'mystash/:zoom/:nav_option',
            :controller => 'stashes',
            :action => 'show'
map.connect 'mystash/:zoom',
            :controller => 'stashes',
            :action => 'show'
map.connect 'mystash',
            :controller => 'stashes',
            :action => 'show'

Мои маршруты в браузере выглядят так: site.com//mystash/zoomin?nav_option=New&quiz=quizon

и вот так выглядит одна из моих ссылок:

<%= link_to "In", stash_path("zoomin", :nav_option => @nav_option, :quiz => @quiz) %>

Любая помощь приветствуется, я довольно новичок в пользовательских маршрутах!

1 Ответ

1 голос
/ 13 января 2010

Вы должны давать этим маршрутам разные имена вместо имен по умолчанию, или вы должны указывать свой маршрут с помощью хэша, а не вызова X_path. Например:

map.stash_zoom_nav_quiz 'mystash/:zoom/:nav_option/:quiz',
  :controller => 'stashes',
  :action => 'show'    
map.stash_zoom_nav 'mystash/:zoom/:nav_option',
  :controller => 'stashes',
  :action => 'show'

Имейте в виду, что когда вы объявляете именованный маршрут, параметры в пути должны быть указаны в вызове X_path без пропусков, а не в виде хэша.

link_to('Foo', stash_zoom_nav_quiz_path(@zoom, @nav_option, @quiz))
link_to('Bar', stash_zoom_nav_path(@zoom, @nav_option))

Альтернатива состоит в том, чтобы не связываться с именованными маршрутами и позволить механизму маршрутизации выяснить это самостоятельно:

link_to('Foo', :controller => 'stashes', :action => 'show', :zoom => @zoom, :nav_option => @nav_option, :quiz => @quiz)

Если вы не уверены, какие маршруты определены или как их вызывать, всегда очень внимательно проверяйте вывод «рейковых маршрутов». Вы также можете написать функциональные тесты для маршрутов с помощью метода assert_routing.

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