ActiveAdmin с дружественным идентификатором

Я использую friendly_id в своем приложении rails 4 с slug. Теперь я использую гем active_admin.

Проблема:

Когда я нажимаю ссылку «Показать» от активного администратора для ресурса Group, возникает следующее исключение:

ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1

Думаю, мне нужно переопределить некоторые из active_admin функций по умолчанию?


person przbadu    schedule 20.11.2014    source источник


Ответы (3)


Бывают случаи, когда приложение отказывается от нескольких ресурсов, поэтому, чтобы сохранить его СУХИМ, есть хорошее решение, требующее нескольких строк кода для всего приложения - просто переопределить контроллер ресурсов Activeadmin.

Создайте файл config/initializers/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

Не забудьте перезапустить сервер.

person Andrey Deineko    schedule 20.11.2014
comment
Я думаю, что это должно быть добавлено в config/intializers/active_admin.rb . Работал для меня, когда я добавил его туда. Friendly_id - 5.1 - person Gautam; 19.04.2016
comment
Не должно иметь значения, в какой инициализатор он добавляется. - person rantingsonrails; 28.02.2018

Лучший подход к @AndreyDeineko - переопределить метод find_resource ActiveAdmin::ResourceController в config/initialisers/active_admin.rb и использовать методы, предоставляемые FriendlyId (на данный момент 5.x):

In config/initialisers/active_admin.rb:

ActiveAdmin.setup do |config|
  # == Friendly Id addon
  ActiveAdmin::ResourceController.class_eval do
    def find_resource
      if resource_class.is_a?(FriendlyId)
        scoped_collection.friendly.find(params[:id])
      else
        scoped_collection.find(params[:id])
      end
    end
  end
  # initial config
end

Для меня это выглядит намного чище, чем размещение в контроллере приложений, поскольку это связано с конфигурацией Active Admin.

person Quentin    schedule 20.11.2015

Нашел решение проблемы:

В 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

Это решило мою проблему.

person przbadu    schedule 20.11.2014