2012-02-18 38 views
1

我是新来的铁轨,并想知道我如何能做到这一点。我想一个URL看起来像这样:使导轨资源和自定义路径冲突工作

http://localhost:3000/businesses/coldfire-gundam 

使用这条路线:

match "/businesses/:permalink", :to => "businesses#show", :as => :business_permalink 
然而

,当我把在此之前这条路线:

resources :businesses 

任何呼叫/企业/ 1 (1作为param [:id])不再工作,显然是因为它被永久声明所捕获

我该如何做到这一点工作呢?

回答

2

您需要一种方法来区分/businesses/:id/businesses/:permalink。该:id应始终是数字(当然,除非你使用MongoDB的),所以如果你能迫使你:permalink总是包含一些非数字那么简单:constraints应该做的伎俩:

match '/businesses/:permalink', :to => 'businesses#show`, :constraints => { :permalink => /.*\D/ }, :as => :business_permalink 

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

如果你碰巧使用的MongoDB那么你:id将可能是一个十六进制BSON ID,所以你想使用/.*\H/为您的约束,你会想一些办法,以确保您始终:permalink至少包含一个非-hex字符。

一旦这一切到位,你可以把你的match "/businesses/:permalink"之前resources :businessesroutes.rb和一切都应该正常工作。并且路线按照它们出现在routes.rb中的相同顺序进行检查,因此您需要在resources之前您的match

1

我会建议使用friendly_id gem来创建永久链接路线。这将以易于重用的方式为您处理大部分“魔术”。

对于创业板和railscast

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