ActiveAdmin с дружественным идентификатором
Я использую friendly_id
в моем приложении rails 4 с slug
. Теперь я использую active_admin gem .
Задача:
Когда я нажимаю на ссылку show от active admin для ресурса Group
, он выбрасывает следующее исключение:
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
Полагаю, мне нужно переопределить некоторые из функций active_admin
по умолчанию?
4 ответа:
Бывают случаи, когда приложение вышло из нескольких ресурсов, поэтому для того, чтобы сохранить его сухим, есть хорошее решение, требующее нескольких строк кода для всего приложения - просто переопределить контроллер ресурсов activeadmin.
Создайте
config/intializers/active_admin_monkey_patching.rb
файл со следующим содержимым:ActiveAdmin::ResourceController.class_eval do def find_resource finder = resource_class.is_a?(FriendlyId) ? :slug : :id scoped_collection.find_by(finder => params[:id]) end end
Не забудьте перезапустить сервер.
Лучший подход к @Andreydeineko's состоит в том, чтобы переопределить метод
ActiveAdmin::ResourceController
'sfind_resource
вconfig/initialisers/active_admin.rb
и использовать методы, предоставляемые FriendlyId (5.x в этой точке):В
config/initialisers/active_admin.rb
:ActiveAdmin.setup do |config| # == Friendly Id addon ActiveAdmin::ResourceController.class_eval do def find_resource resource_class.is_a?(FriendlyId) ? scoped_collection.friendly.find(params[:id]) : scoped_collection.find(params[:id]) end end # initial config end
Для меня это выглядит намного чище, чем поместить его в контроллер приложения, так как он связан с конфигурацией Active Admin.
Найдено решение задачи:
В вашем
app/admin/[ResourceName.rb]
добавьте:Это решило мою проблему.# app/admin/group.rb # find record with slug(friendly_id) controller do def find_resource begin scoped_collection.where(slug: params[:id]).first! rescue ActiveRecord::RecordNotFound scoped_collection.find(params[:id]) end end end