2014-11-20 14 views
10

Sto usando friendly_id nella mia applicazione di rotaie 4 con slug. Ora sto usando active_admin gem.ActiveAdmin con id amichevole

Problema:

Quando scatto in mostra link di amministrazione attivo per Group risorsa, sta gettando la seguente eccezione:

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

immagino, ho bisogno di sostituire alcuni dei active_admin funzioni predefinite?

risposta

19

Ci sono casi in cui l'applicazione ha abbandonato alcune risorse, quindi per mantenerla ASCIUGATURA esiste una soluzione carina che richiede poche righe di codice per l'intera applicazione: basta sovrascrivere il controllore delle risorse di activeadmin.

Creare config/intializers/active_admin_monkey_patching.rb file con il seguente contenuto:

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 

Non dimenticare di riavviare il server.

+0

Penso che debba essere aggiunto in 'config/intializers/active_admin.rb'. Ha funzionato per me quando l'ho aggiunto lì. 'Friendly_id - 5.1' – nik

+1

Non dovrebbe importare quale inizializzatore venga aggiunto. – rantingsonrails

5

soluzione trovata per il problema:

Nel vostro app/admin/[ResourceName.rb] aggiuntivo:

# 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 

Questo risolto il mio problema.

9

Un approccio migliore @ AndreyDeineko è quello di sostituire il metodo ActiveAdmin::ResourceController s' find_resource in config/initialisers/active_admin.rb e sfruttare i metodi forniti da FriendlyId (5.x a questo punto):

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 

Questo mi sembra molto più pulito, rispetto a metterlo nel controller dell'applicazione, in quanto è correlato alla configurazione di Active Admin.

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