【问题标题】:ActiveAdmin with friendly id具有友好 ID 的 ActiveAdmin
【发布时间】:2014-11-20 06:09:23
【问题描述】:

我在带有slug 的rails 4 应用程序中使用friendly_id。现在我使用active_admin gem

问题:

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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-4 ruby-on-rails-5 activeadmin


    【解决方案1】:

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

    别忘了重启服务器。

    【讨论】:

    • 我认为它必须添加到 config/intializers/active_admin.rb 中。当我在那里添加它时为我工作。 Friendly_id - 5.1
    • 添加到哪个初始化程序中都没有关系。
    【解决方案2】:

    解决@AndreyDeineko 的更好方法是在config/initialisers/active_admin.rb 中覆盖ActiveAdmin::ResourceControllerfind_resource 方法并利用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 的配置有关。

    【讨论】:

      【解决方案3】:

      找到问题的解决方案:

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

      这解决了我的问题。

      【讨论】:

        【解决方案4】:
          class User < ActiveRecord::Base
             extend FriendlyId
          friendly_id :username, :use => [:slugged, :finders]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-10-23
          • 2015-03-11
          • 2015-03-09
          • 2016-05-15
          • 2014-09-17
          相关资源
          最近更新 更多