我正在尝试在rails中创建自定义路由,并且不确定我是否以正确的方式进行此操作。首先,我有一个RESTful资源用于存储,作为控制器重定向到mystash:
map.resources :stashes, :as => 'mystash'
site.com/mystash goes to :controller => 'stashes', :action => 'show'
这就是我想要的。现在它变得有点令人困惑。我希望能够在这条路线上添加条件参数。最后,我希望有一条看起来像这样的路线:
site.com/mystash/zoomout/new/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) %>
感谢任何帮助,我对自定义路线很新!
答案 0 :(得分:1)
您应该为这些路由提供不同的名称而不是默认名称,或者您应该使用哈希而不是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)
如果您不确定定义了哪些路线,或者如何调用它们,请务必仔细检查“rake路线”的输出。您还可以使用assert_routing方法为路由编写功能测试。