ActiveAdmin,友好ID

prz*_*adu 11 ruby ruby-on-rails friendly-id activeadmin ruby-on-rails-4

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

问题:

当我从Group资源的活动管理员点击显示链接时,它抛出以下异常:

ActiveRecord::RecordNotFound at /admin/groups/username20-s-group-1
Run Code Online (Sandbox Code Playgroud)

我想,我需要覆盖一些active_admin默认函数?

And*_*eko 22

有些情况下,当应用程序退出一些资源时,为了保持DRY,有一个很好的解决方案需要几行代码用于整个应用程序 - 只需覆盖activeadmin的资源控制器.

config/intializers/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
Run Code Online (Sandbox Code Playgroud)

不要忘记重启服务器.

  • 它被添加到哪个初始化程序中应该无关紧要。 (2认同)

Que*_*tin 13

@ AndreyDeineko的更好方法是覆盖ActiveAdmin::ResourceController's 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
      resource_class.is_a?(FriendlyId) ? scoped_collection.friendly.find(params[:id]) : scoped_collection.find(params[:id])
    end
  end

  # initial config
end
Run Code Online (Sandbox Code Playgroud)

这看起来比我在应用程序控制器中更清晰,因为它与Active Admin的配置有关.


prz*_*adu 5

找到问题的解决方案:

在你的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
Run Code Online (Sandbox Code Playgroud)

这解决了我的问题.