Почему у моих маршрутов Rails 2 есть строки запроса? - PullRequest
3 голосов
/ 01 сентября 2010

Иногда мне нужно передать дополнительные параметры на страницу через URL.Я делал это в прошлом с помощью нескольких общих заполнителей в файле маршрутов, которые я называю «род» и «вид».Раньше это работало, но теперь оно начало создавать URL-адреса со строками запроса.

Версия Rails - 2.3.8.

Файл маршрутов:

ActionController::Routing::Routes.draw do |map|
  map.root :controller => 'main', :action => 'index'
  map.connect ':controller', :action => 'index'
  map.connect ':controller/:action'
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:genus/:id'
  map.connect ':controller/:action/:genus/:species/:id'
end

Страница индекса:

<p>
<%= url_for :controller => 'main', :action => 'test', :genus => 42, :id => 1 %>
</p>

Страница теста

<p>
<%= params.inspect -%>
</p>

Страница индекса показывает / main / test? Genus = 42 & id = 1 где бы яЯ ожидал / main / test / 42/1 .

Однако, если я перейду к / main / test / 42/1 , тогда я увижу правильные параметры:

{"controller" => "main", "action" => "test", "genus" => "42", "id" => "1"}

Есть идеи, что я делаю не так?

Ответы [ 2 ]

5 голосов
/ 01 сентября 2010

Ваши маршруты в обратном порядке; сначала вы хотите более конкретные маршруты, а потом более общие маршруты. Rails выберет первый маршрут, который он может использовать для соответствия заданному набору параметров.

ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:genus/:species/:id'
  map.connect ':controller/:action/:genus/:id'
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action'
  map.connect ':controller', :action => 'index'
  map.root :controller => 'main', :action => 'index'
end

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

ActionController::Routing::Routes.draw do |map|
  map.with_options(:path_prefix => ":controller/:action") do |con|
    con.species ":genus/:species/:id"
    con.genus   ":genus/:id"
    con.connect ":id"
    con.connect ""
  end   
end

Который дает вам следующие маршруты:

species /:controller/:action/:genus/:species/:id
  genus /:controller/:action/:genus/:id
        /:controller/:action/:id
        /:controller/:action

Тогда вы можете просто использовать:

<%=genus_path("main", "test", 42, 1) %>

Чтобы получить:

"/main/test/42/1"
1 голос
/ 02 сентября 2010

Это довольно глупое решение, но это должно сработать:

ActionController::Routing::Routes.draw do |map|
  map.connect ':controller/:action/:genus/:species/:id', :genus => /\d+/,
    :species => /\d+/, :id => /\d+/
  map.connect ':controller/:action/:genus/:id', :genus => /\d+/, :id => /\d+/
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action'
  map.connect ':controller', :action => 'index'
  map.root :controller => 'main', :action => 'index'
end

Проблема в том, что все компоненты маршрутов являются необязательными в Rails 2. К счастью, это лучше в Rails 3. Я думаю, что то, что связано с приоритетом маршрутов, изменилось в версии 2.3.5-2.3. 8.

...