2014-11-20 2 views
10

slug으로 내 레일 4 애플리케이션에 friendly_id을 사용하고 있습니다. 이제 active_admin gem을 사용 중입니다.친화적 인 ID가있는 ActiveAdmin

문제 :

내가 Group 자원에 대한 활성 관리자에서 쇼 링크를 클릭, 그것은 다음과 같은 예외 던지고있다 :

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

내 생각을, 나는 active_admin의 일부를 오버라이드 (override) 할 필요가 기본 기능? 이 문제에 대한

답변

19

응용 프로그램이 약간의 자원을 종료 할 때가 있으므로, 응용 프로그램을 DRY 상태로 유지하려면 전체 응용 프로그램을위한 몇 줄의 코드가 필요합니다. 간단히 activeadmin의 자원 제어기를 덮어 씁니다.

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 

서버를 다시 시작하는 것을 잊지 마세요 :

은 다음과 같은 내용으로 config/intializers/active_admin_monkey_patching.rb 파일을 만듭니다.

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 

@ AndreyDeineko의에

+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

더 좋은 방법은 FriendlyId (이 시점에서 5.x를)에서 제공하는 방법을 config/initialisers/active_admin.rbActiveAdmin::ResourceControllerfind_resource 방법을 무시하고 활용하는 것입니다 이것은 액티브 관리자의 구성과 관련이 있기 때문에 응용 프로그램 컨트롤러에 넣는 것보다 훨씬 깨끗합니다.

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