我是rails的新手,想知道如何才能做到这一点。我希望URL看起来像这样:
http://localhost:3000/businesses/coldfire-gundam使用此路由:
match "/businesses/:permalink", :to => "businesses#show", :as => :business_permalink但是,当我将此路由放在此之前时:
resources :businesses任何对/businesses/1 (1表示为param:id)的调用都不再起作用,显然是因为它被permalink声明捕获
那我怎么才能让它工作呢?
发布于 2012-02-19 06:10:35
您需要一种方法来区分/businesses/:id和/businesses/:permalink。:id应该始终是数字(当然,除非您使用的是MongoDB),所以如果您可以强制您的:permalink始终包含非数字的内容,那么一个简单的:constraints就可以做到这一点:
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。
发布于 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
https://stackoverflow.com/questions/9344403
复制相似问题