Ruby on rails Rails:通过检测参数映射冲突路由

Ruby on rails Rails:通过检测参数映射冲突路由,ruby-on-rails,ruby,routes,Ruby On Rails,Ruby,Routes,嘿!我试图在Rails应用程序中设置路由,以便Rails根据传递的参数类型将请求发送到不同的操作 我有课程,它有一个属性state,它是一个带有两个字母state缩写的字符串。当用户访问/courses/1时,我希望Rails在courses控制器中显示show操作(并将参数作为:id传递)。但是,当用户访问/courses/CO时,我希望Rails显示索引操作,并将参数传递为:state 所以/courses/1相当于 :controller => 'courses', :action

嘿!我试图在Rails应用程序中设置路由,以便Rails根据传递的参数类型将请求发送到不同的操作

我有
课程
,它有一个属性
state
,它是一个带有两个字母state缩写的字符串。当用户访问
/courses/1
时,我希望Rails在
courses
控制器中显示
show
操作(并将参数作为
:id
传递)。但是,当用户访问
/courses/CO
时,我希望Rails显示
索引
操作,并将参数传递为
:state

所以
/courses/1
相当于

:controller => 'courses', :action => 'show', :id => '1'
:controller => 'courses', :action => 'index', :state => 'CO'
/courses/CO
将相当于

:controller => 'courses', :action => 'show', :id => '1'
: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

我担心这不会起作用,因为将路径映射到控制器和操作的结构是在rails应用程序启动时设置的,参数处理在请求时进行

您可以做的是将CoursesController的show操作中的:id参数与有效状态列表相匹配,然后重定向或呈现不同的操作


希望这会有所帮助。

我担心这不会起作用,因为将路径映射到控制器和操作的结构是在rails应用程序启动时设置的,参数处理是在请求时进行的

您可以做的是将CoursesController的show操作中的:id参数与有效状态列表相匹配,然后重定向或呈现不同的操作


希望这能有所帮助。

这是可行的,但是你需要编辑所有指向索引的链接,比如说
courses\u path('AA')
,而你将无法使用一些很好的帮助程序,比如form\u for,它假设你遵循的惯例是#create仅仅是#带有POST请求的索引。(熟悉表格标签)

不过,它将保持您的路线名称不变

(顺便说一下,您的/co与您的正则表达式不匹配,正则表达式需要大写字符)



有趣的是:我们真的需要路由器的抽象吗

这是可行的,但是你需要编辑所有指向索引的链接,比如说
courses\u path('AA')
,你将无法使用一些很好的帮助程序,比如form\u for,它假设你遵循的惯例是#create只是#通过POST请求进行索引。(熟悉表格标签)

不过,它将保持您的路线名称不变

(顺便说一下,您的/co与您的正则表达式不匹配,正则表达式需要大写字符)



有趣的是:我们真的需要路由器的抽象吗

允许默认情况(无参数)是否可以避免我更改所有这些链接?例如:
map.connect'/courses',:controller=>'courses',:action=>'index',:state=>'AL',:method=>:get
允许默认情况(无参数)是否可以防止我更改所有这些链接?例如:
map.connect'/courses',:controller=>'courses',:action=>'index',:state=>'AL',:method=>:get