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]