12

friendly_id在我的 rails 4 应用程序中使用slug. 现在我正在使用active_admin gem

问题:

当我从活动管理员单击Group资源的显示链接时,它会引发以下异常:

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

我想,我需要重写一些active_admin默认函数?

4

4 回答 4

28

在某些情况下,当应用程序退出了一些资源时,为了保持它的干燥,有一个很好的解决方案需要为整个应用程序编写几行代码 - 只需覆盖 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

不要忘记重新启动服务器。

于 2014-11-20T07:27:22.343 回答
19

@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 的配置有关。

于 2015-11-20T11:49:42.520 回答
6

找到问题的解决方案:

在您的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

这解决了我的问题。

于 2014-11-20T07:02:26.437 回答
-1
  class User < ActiveRecord::Base
     extend FriendlyId
  friendly_id :username, :use => [:slugged, :finders]
于 2017-02-06T03:26:14.743 回答