可能有办法做到这一点与freindly_id,但我认为与友好id的问题是事物的范围由模型。
如果我想要真正地在网站范围内猛击,我会创建一个与我的模型有多态关系的slu table表。
Sluggable_type和sluggable_id然后一个slug字段与完整的永久链接/ slug。
+---------------------------------------------+
| sluggable_type | sluggable_id | slug |
| user | 13 | users/john |
+---------------------------------------------+
现在我能做的做一个通配符包罗万象的路线或运行时创建了我所有的蛞蝓的路线和强制路由刷新当模型更新,这是该sluggable控制之下。
routes.rb
get "/*segments",
:controller => 'slugs',
:action => 'dynamicroute'
现在,在您SlugsController实现诸如
def dynamicroute
segments = params[:segments]
slugs.find_by_slug(segments)
slug.sluggable_type.constantize.find(slug.sluggable_id) #retrive real record
#some magic to handle the slugged item maybe redirect to the appropriate
#controller or somehow call the show view for that controller
end
OR
routes.rb
begin
Slug.all.each do |s|
begin
get "#{s.slug}" => "#{s.sluggable_type.demodulize.pluralize.camelize}#show"
rescue
end
end
rescue
end
如果一个方法您使用第二个方法来路由确保您拨打
YOUR_APP_NAME::Application.reload_routes!
编辑任何猛击记录刷新路由表之后。
我们遇到了类似的问题,我们可能会试着用这种方法来试试。
hmm。你可能有一张slu table子的桌子,你可以保留它的类型。那么只需添加一个检查该类型的路由并尝试基于该路由重定向。 – jvnill 2013-03-13 01:08:26
这似乎有点过分,因为现在我需要提出两个请求来获取对象,不是吗? – 2013-03-13 01:09:27
是。我不知道Rails如何区分slu unless,除非它们已经被定义,或者至少有一些可以区分它们的模式。 – jvnill 2013-03-13 01:15:21