我friendly_id
在我的 rails 4 应用程序中使用slug
. 现在我正在使用active_admin gem。
问题:
当我从活动管理员单击Group
资源的显示链接时,它会引发以下异常:
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
我想,我需要重写一些active_admin
默认函数?
我friendly_id
在我的 rails 4 应用程序中使用slug
. 现在我正在使用active_admin gem。
问题:
当我从活动管理员单击Group
资源的显示链接时,它会引发以下异常:
ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
我想,我需要重写一些active_admin
默认函数?
在某些情况下,当应用程序退出了一些资源时,为了保持它的干燥,有一个很好的解决方案需要为整个应用程序编写几行代码 - 只需覆盖 activeadmin 的资源控制器。
创建config/initializers/active_admin_monkey_patching.rb
具有以下内容的文件:
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
不要忘记重新启动服务器。
@AndreyDeineko 的更好方法是重写ActiveAdmin::ResourceController
'find_resource
方法config/initialisers/active_admin.rb
并利用 FriendlyId 提供的方法(此时为 5.x):
在config/initialisers/active_admin.rb
:
ActiveAdmin.setup do |config|
# == Friendly Id addon
ActiveAdmin::ResourceController.class_eval do
def find_resource
if resource_class.is_a?(FriendlyId)
scoped_collection.friendly.find(params[:id])
else
scoped_collection.find(params[:id])
end
end
end
# initial config
end
这对我来说看起来比把它放在应用程序控制器中要干净得多,因为它与 Active Admin 的配置有关。
找到问题的解决方案:
在您的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
这解决了我的问题。
class User < ActiveRecord::Base
extend FriendlyId
friendly_id :username, :use => [:slugged, :finders]