ActiveAdmin с дружественным идентификатором
Я использую friendly_id
в моем приложении rails 4 с slug
. Теперь я использую active_admin gem.
Проблема:
Когда я нажимаю ссылку show из активного admin для ресурса Group
, это бросает следующее исключение:
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
Я думаю, мне нужно переопределить некоторые функции active_admin
по умолчанию?
Ответы
Ответ 1
Есть случаи, когда приложение закрывает несколько ресурсов, поэтому, чтобы сохранить его DRY, есть хорошее решение, требующее нескольких строк кода для всего приложения - просто переопределите контроллер ресурсов 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
Не забудьте перезагрузить сервер.
Ответ 2
Лучший подход к @AndreyDeineko заключается в переопределении метода ActiveAdmin::ResourceController
find_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.
Ответ 3
Найдено решение проблемы:
В app/admin/[ResourceName.rb]
add:
# 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
Это решило мою проблему.
Ответ 4
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :username, :use => [:slugged, :finders]