如何检测Rails 3路由中的整数?

我想在rotues.rb中做一些额外的逻辑,这可能不属于那里,但它似乎对我最有意义。

我有两条相互矛盾的路线。 要原始:

match '/videos/:browseby' => 'videos#browse', :as => "browse_by" 

其中:browseby正在查找字符串,例如“标签”,以按标签浏览video。

然而,(并且很可能看到了这一点)我也有我的基本节目资源(再次以原始forms):

 match '/videos/:id' => 'videos#show', :as => "video" 

其中:id正在查找videoID的整数。

有没有办法添加一些逻辑,如…

 match '/videos/:id' => 'videos#show', :as => "video", :format(:id) => :integer 

(这是我假设的rails语法,以帮助显示我正在寻找的内容。)

我知道我可以在Controller级别中修改它,但是在路由级别处理它更有意义。

您可以尝试使用:constraints和regex:

 match '/videos/:id' => 'videos#show', :as => "video", :constraints => { :id => /\d/ } match '/videos/:browseby' => 'videos#browse', :as => "browse_by" 

您还需要确保更宽松:browseby版本位于:id版本之后。 请注意, 正则表达式约束在开头隐式锚定,因此只要您的:browseby值不以数字开头 ,它就会起作用。

如果您的标签以数字开头,那么您可以使用对象作为约束 ,然后您可以在正则表达式中包含锚点:

 class VideoIdsOnly def matches?(request) request.path =~ %r{\A/videos/\d+\z} end end match '/videos/:id' => 'video#show', :as => "video", :constraints => VideoIdsOnly.new match '/videos/:browseby' => 'videos#browse', :as => "browse_by"