【发布时间】:2010-06-29 23:45:27
【问题描述】:
嘿!我正在尝试在 Rails 应用程序中设置路由,以便根据传递的参数类型,Rails 将请求发送到不同的操作。
我有courses,它有一个属性state,它是一个带有两个字母状态缩写的字符串。当用户访问/courses/1 时,我希望Rails 在courses 控制器中显示show 操作(并将参数作为:id 传递)。但是,当用户访问/courses/CO 时,我希望Rails 显示index 操作并将参数作为:state 传递。
所以/courses/1 相当于
:controller => 'courses', :action => 'show', :id => '1'
而/courses/CO 将等同于
:controller => 'courses', :action => 'index', :state => 'CO'
我试过这个:
map.resources :courses, :except => { :index, :show }
map.connect 'courses/:state', :controller => 'courses', :action => 'index', :state => /[A-Z]{2}/
map.connect 'courses/:id', :controller => 'courses', :action => 'show', :id => /[0-9]+/
但是它坏了(rails 服务器甚至无法启动)。我通常不会对路线做这样的事情,所以我不知道如何做。谢谢!
编辑:修正了一个错字,感谢 JC。
当前的解决方案如下所示:
map.resources :courses, :except => [ :index, :show ]
map.courses '/courses', :controller => 'courses', :action => 'index', :state => 'AL', :method => :get
map.courses '/courses/:state', :controller => 'courses', :action => 'index', :requirements => { :state => /[A-Z]{2}/ }, :method => :get
map.course '/courses/:id', :controller => 'courses', :action => 'show', :requirements => { :id => /[0-9]+/ }, :method => :get
【问题讨论】:
标签: ruby-on-rails ruby routes