2010-09-01 84 views
3

我有时需要通过URL将其他参数传递给页面。过去我在路由文件中使用了两个通用占位符,我称其为“genus”和“species”。这用于工作,但现在它已经开始用查询字符串生成URL。为什么我的Rails 2路由有查询字符串?

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> 

索引页面显示/主/测试属= 42 & id = 1我可以预期/main/test/42/1

然而,如果我去/主/测试/1分之42然后我看到正确的参数:

{ “控制器”=> “主”, “动作”=>“测试“,”genus“=>”42“,”id“=>”1“}

任何想法我做错了什么?

回答

1

这是一个相当愚蠢的解决方案,但这应该工作:

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中幸运的是,这是对Rails 3好我的猜测是某种与该路由的优先级做了约2.3版本改变。 5-2.3.8。

+0

辉煌,它的作品!我认为你对2.3.8版本的改变是正确的,因为我确信我使用了很久以前的东西。具体要求将解决它,直到我移动到Rails 3.非常感谢。 – Graham 2010-09-03 09:43:29

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 

这就是说,你可以很容易地使用命名的路线。

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" 
+0

谢谢,克里斯,但这实际上并没有帮助。反转订单会生成更好看的网址,但这些网址在导航到它们时并未正确解释。路径“/ main/test/42/1”给出了{“controller”=>“main”,“action”=>“test”,“genus”=>“42”,“species”=>“1”}但我们希望“1”匹配:id不是:物种。看起来,即使某些组件缺失,Rails也会匹配第一条路由。使用命名路由将使routes.rb文件更整洁,但它对URL解释没有任何影响。问题依然存在...... – Graham 2010-09-02 15:33:53

+0

我想我需要一些额外的信息,然后;如果你想要一个属性/物种/ ID的路线,你需要3条信息。我在我的原始答复(我已经更正)中犯了一个错误,但我试图理解问题的性质 - 当所有条件都满足时,Rails应该只匹配一条路径。在上述路线中,species_path需要5个参数,genus_path需要4个,其他需要3/2。 – 2010-09-02 16:44:16

+0

我同意。当条件满足时,Rails应该只匹配一条路径,但似乎并非如此。路径“/ main/test/42/1”有四条信息。但是当我导航到那条路径时,Rails告诉我“物种”=>“1”。这是错误的,因为:物种只存在于具有五条信息的路线中。 所以我的问题是这样的。使用未命名的更具体的第一组路由(从您的答案的第一个代码块),我不明白为什么Rails匹配URL“/ main/test/42/1”与第一行。它应该只匹配第二行。 – Graham 2010-09-02 17:03:30

相关问题