2014-11-20 7 views
10

Ich verwende friendly_id in meiner Schiene 4 Anwendung mit slug. Jetzt verwende ich active_admin gem.ActiveAdmin mit freundlicher ID

Problem:

Wenn ich für Group Ressource anzeigen Link aus dem aktiven Admin klicken, Es wird die folgende Ausnahme werfen:

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

Ich denke, ich brauche einige der active_admin außer Kraft zu setzen Standardfunktionen?

Antwort

19

Es gibt Fälle, in denen die Anwendung einige Ressourcen beendet hat. Um sie also DRY zu halten, gibt es eine nette Lösung, die nur wenige Codezeilen für die gesamte Anwendung benötigt - überschreiben Sie einfach den Ressourcen-Controller von activeadmin.

erstellen config/intializers/active_admin_monkey_patching.rb-Datei mit folgendem Inhalt:

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 

Vergessen Sie nicht, den Server neu zu starten.

+0

Ich denke, es muss in 'config/initializers/active_admin.rb' hinzugefügt werden. Arbeitete für mich, als ich es dort hinzufügte. 'Friendly_id - 5.1' – nik

+1

Es sollte egal sein, welcher Initialisierer hinzugefügt wird. – rantingsonrails

5

gefunden Lösung für das Problem:

In Ihrem 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 

Das ist mein Problem gelöst.

9

Ein besserer Ansatz zu @ AndreyDeineko der ist ActiveAdmin::ResourceController ‚s find_resource Methode in config/initialisers/active_admin.rb und nutzt die Methoden zur Verfügung gestellt von FriendlyId (5.x an dieser Stelle) außer Kraft zu setzen:

In 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 

Dies sieht für mich viel sauberer aus, als es in den Anwendungs-Controller einzufügen, da es mit der Konfiguration von Active Admin zusammenhängt.

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