创建自定义Rails路由

时间:2010-01-13 20:22:30

标签: ruby-on-rails rest routing

我正在尝试在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) %>

感谢任何帮助,我对自定义路线很新!

1 个答案:

答案 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方法为路由编写功能测试。