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"}
我有什么想法我做错了吗?
你的路线颠倒了; 您首先需要更具体的路由,以后需要更多通用路由.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)