rails index form docs all active ruby-on-rails ruby ruby-on-rails-4 activeadmin friendly-id

ruby-on-rails - index - controller active admin



ActiveAdmin con ID amigable (4)

Estoy usando friendly_id en mi aplicación Rails 4 con slug . Ahora estoy usando active_admin gem .

Problema:

Cuando hago clic en Mostrar enlace desde el administrador activo para el recurso de Group , arroja la siguiente excepción:

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

¿Supongo que tengo que anular algunas de las active_admin predeterminadas de active_admin ?


Solución encontrada para el problema:

En su app/admin/[ResourceName.rb] agregue:

# 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

Esto resolvió mi problema.


Un mejor enfoque para @ AndreyDeineko es anular el ActiveAdmin::ResourceController en config/initialisers/active_admin.rb y aprovechar los métodos provistos por FriendlyId (5.x en este punto):

En 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

Esto me parece mucho más limpio que ponerlo en el controlador de la aplicación, ya que está relacionado con la configuración de Active Admin.


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


Hay casos en que la aplicación ha dejado algunos recursos, por lo tanto, para mantenerlo SECO hay una buena solución que requiere pocas líneas de código para toda la aplicación: simplemente anule el controlador de recursos de activeadmin.

Crea el archivo config/intializers/active_admin_monkey_patching.rb con el siguiente contenido:

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

No te olvides de reiniciar el servidor.