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 10

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's 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.

Найдено решение задачи:

В вашем 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
Это решило мою проблему.
  class User < ActiveRecord::Base
     extend FriendlyId
  friendly_id :username, :use => [:slugged, :finders]