friendly_idはURLを人や検索エンジンから見てわかりやすくしてくれるgemです。
ActiveAdminはリソース毎の管理画面を簡単に作れるgemで、RESTなURLは用意されています。その半面、ActiveAdminのルールに沿わない場合は少しカスタマイズが必要です。
やりたいこと
- リソースArticleに対して、基本的な一覧/詳細/登録/編集/削除を行う管理画面を作成する。
- ユーザが利用する画面では、ArticleのURLをslugで表したいので、friendly_idを使う。
問題
friendly_idを利用したモデルの詳細ページは以下のようにslugでアクセスすることができます。
http://localhost:3000/articles/todays-daiary
ActiveAdminの管理画面でリンクをたどって、Articleの詳細ページに遷移しようとすると、以下のようなURLになります。
url
http://localhost:3000/admin/articles/todays-daiary
しかし、ActiveAdminは自動で/admin/articles/:idというURLでアクセスされることを期待しているので、以下のようなエラーが表示されます。
Couldn't find Article with 'id'=todays-daiary
解決方法
ActiveAdminのリソースのfinderを以下のように、friendly_idのfinderを通すように設定することで、slugのURLでリソースにアクセスできるようになります。
admin/article.rb
ActiveAdmin.register Article do
controller do
def find_resource
scoped_collection.friendly.find(params[:id])
end
end
end