首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使Rails资源和自定义路由发生冲突

使Rails资源和自定义路由发生冲突
EN

Stack Overflow用户
提问于 2012-02-19 05:47:42
回答 2查看 162关注 0票数 1

我是rails的新手,想知道如何才能做到这一点。我希望URL看起来像这样:

代码语言:javascript
复制
http://localhost:3000/businesses/coldfire-gundam

使用此路由:

代码语言:javascript
复制
match "/businesses/:permalink", :to => "businesses#show", :as => :business_permalink

但是,当我将此路由放在此之前时:

代码语言:javascript
复制
resources :businesses

任何对/businesses/1 (1表示为param:id)的调用都不再起作用,显然是因为它被permalink声明捕获

那我怎么才能让它工作呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-19 06:10:35

您需要一种方法来区分/businesses/:id/businesses/:permalink:id应该始终是数字(当然,除非您使用的是MongoDB),所以如果您可以强制您的:permalink始终包含非数字的内容,那么一个简单的:constraints就可以做到这一点:

代码语言:javascript
复制
match '/businesses/:permalink', :to => 'businesses#show`, :constraints => { :permalink => /.*\D/ }, :as => :business_permalink

仅当:permalink包含至少一个非数字字符时,/.*\D/才强制路由匹配。您需要.*,因为路由正则表达式隐式地锚定在开头。

如果您碰巧使用的是MongoDB,那么您的:id可能是一个十六进制的BSON ID,所以您可能希望使用/.*\H/作为约束,并且需要某种方法来确保您的:permalink始终包含至少一个非十六进制字符。

一旦所有这些都准备就绪,您就可以在routes.rb中将match "/businesses/:permalink"放在resources :businesses之前,一切都应该正常工作。而且,检查路由的顺序与它们在routes.rb中显示的顺序相同,因此您会希望match优先于resources

票数 2
EN

Stack Overflow用户

发布于 2012-02-19 06:07:02

我建议使用friendly_id gem来创建固定链接路由。这将以一种容易重用的方式为你处理大部分的“魔法”。

gem和railscast的资源:https://github.com/norman/friendly_id http://railscasts.com/episodes/314-pretty-urls-with-friendlyid

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9344403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档