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.