2014-11-20 5 views
10

Я использую friendly_id в моем приложении 4 рельсов с slug. Теперь я использую active_admin gem.ActiveAdmin с дружественным идентификатором

Проблема:

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

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

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

ответ

19

Есть случаи, когда приложение оставляет несколько ресурсов, следовательно, чтобы сохранить его 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 

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

+0

Я думаю, что это должно быть добавлено в 'config/intializers/active_admin.rb'. Работал для меня, когда я добавил его туда. 'Friendly_id - 5.1' – nik

+1

Не имеет значения, к какому инициализатору он добавляется. – rantingsonrails

5

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

В вашем 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 

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

9

Лучший подход к @ AndreyDeineko является переопределить find_resource метод ActiveAdmin::ResourceController «ы в 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.

0
class User < ActiveRecord::Base 
    extend FriendlyId 
    friendly_id :username, :use => [:slugged, :finders]