使用 freindly_id 可能有一种方法可以做到这一点,但我认为友好 id 的问题在于事情是由模型限定的。
如果我想要真正的站点范围的 slugging,我会创建一个与我的所有模型具有多态关系的 slugs 表。
Sluggable_type 和 sluggable_id,然后是一个带有完整永久链接/slug 的 slug 字段。
+---------------------------------------------+
| sluggable_type | sluggable_id | slug |
| user | 13 | users/john |
+---------------------------------------------+
现在我可以做一个通配符捕获所有路由或在运行时为我的所有 slug 创建路由,并在更新受此 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
或者
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!
编辑任何 slugged 记录以刷新路由表后。
我们也遇到过类似的问题,我们可能会尝试对这种方法进行优化。