freindly_id でこれを行う方法があるかもしれませんが、フレンドリー ID の問題は、物事がモデルによってスコープされていることだと思います。
本当にサイト全体のスラッグが必要な場合は、すべてのモデルとのポリモーフィックな関係を持つスラッグ テーブルを作成します。
Sluggable_type と sluggable_id、そして完全なパーマリンク/スラッグを含むスラッグ フィールド。
+---------------------------------------------+
| sluggable_type | sluggable_id | slug |
| user | 13 | users/john |
+---------------------------------------------+
これで、すべてのルートをキャッチするワイルドカードを実行するか、実行時にすべてのスラッグのルートを作成し、このスラッガブルな制御下にあるモデルが更新されたときにルートを強制的に更新することができます。
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
ルーティングに2番目のアプローチを使用する場合は、必ず呼び出してください
YOUR_APP_NAME::Application.reload_routes!
遅延したレコードを編集してルーティング テーブルを更新した後。
私たちも同様の問題を抱えており、このアプローチをジェム化することを試みるかもしれません。