为什么我的Rails 2路由有查询字符串?

Gra*_*ham 3 configuration routing ruby-on-rails query-string

我有时需要通过URL将其他参数传递给页面.我之前在路由文件中使用了几个通用占位符,我将其称为"genus"和"species".这曾经有用,但现在它已开始使用查询字符串生成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
Run Code Online (Sandbox Code Playgroud)

索引页面是:

<p>
<%= url_for :controller => 'main', :action => 'test', :genus => 42, :id => 1 %>
</p>
Run Code Online (Sandbox Code Playgroud)

测试页面是

<p>
<%= params.inspect -%>
</p>
Run Code Online (Sandbox Code Playgroud)

索引页面显示/ main/test?genus = 42&id = 1我希望/ main/test/42/1.

但是,如果我转到/ main/test/42/1,那么我会看到正确的参数:

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

我有什么想法我做错了吗?

Chr*_*ald 5

你的路线颠倒了; 您首先需要更具体的路由,以后需要更多通用路由.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
Run Code Online (Sandbox Code Playgroud)

也就是说,你可以很容易地使用命名路由.

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
Run Code Online (Sandbox Code Playgroud)

哪个可以获得以下路线:

species /:controller/:action/:genus/:species/:id
  genus /:controller/:action/:genus/:id
        /:controller/:action/:id
        /:controller/:action
Run Code Online (Sandbox Code Playgroud)

然后,你可以使用:

<%=genus_path("main", "test", 42, 1) %>
Run Code Online (Sandbox Code Playgroud)

要得到:

"/main/test/42/1"
Run Code Online (Sandbox Code Playgroud)