【问题标题】:Rails - Can I use Ransack and CanCan together?Rails - 我可以同时使用 Ransack 和 CanCan 吗?
【发布时间】:2012-11-05 22:54:32
【问题描述】:

我正在尝试根据用户的授权获取搜索结果...

【问题讨论】:

    标签: ruby-on-rails-3.1 cancan ransack


    【解决方案1】:

    执行 Ransack 搜索后,只需使用 CanCan 过滤结果。这是我的应用列出提供程序的示例。

    如果你的技能不使用方块,请使用accessible_by

    def index
      @search = Provider.sorted.search(params[:q])
      @providers = @search.result.accessible_by(current_ability)
    end
    

    如果你的技能使用方块,你不能使用accessible_by

    def index
      @search = Provider.sorted.search(params[:q])
      @providers = @search.result.select{|p| can? :read, p}
    end
    

    有关更多详细信息和示例,请查看 Fetching Records 上的 cancan wiki

    希望有帮助

    【讨论】:

    • 你测试过这个吗?当我查看 cancan(can) 代码时,看起来accessible_by 不能在一系列范围内使用...
    • 是的,sortedProvider 上的命名范围。查看 cancan wiki 上的 Fetching Records,它解释了 accessible_by 是一个作用域,因此它可以与其他作用域链接。
    【解决方案2】:
    As of 1.4 the index action will load the collection resource using accessible_by
    

    所以现在我们在index 操作中拥有所有可访问的记录。因此以下将起作用

    def ProvidersController
      before_filter :authenticate_user!
      load_and_authorize_resource
    
      def index
        @q = @providers.search(params[:q]).page(params[:page])
        @providers = @q.result
      end
    
    end
    

    【讨论】:

    • 对于未来的搜索,默认情况下这不起作用,CanCan 不会过滤搜索查询。您需要使用已接受的答案。
    • 它适用于我,更改为 search 现在是 ransack。 CanCanCan 可以过滤 ActiveRecord 关系,如果 load_and_authorize_resource 包含在控制器的顶部,则 @providersindex 的条目中保留该关系。
    • 它仍然相关。我正在使用 Rails 6、Ruby 2.7、ransack (2.3.2)、cancancan (3.0.2)。许多人会收到search 方法弃用警告,但它确实有效。我建议开始使用ransack 而不是search
    猜你喜欢
    • 2017-05-30
    • 2015-02-28
    • 2011-07-21
    • 2015-05-19
    • 2019-05-21
    • 2021-09-05
    • 2014-04-08
    • 2020-06-23
    • 1970-01-01
    相关资源
    最近更新 更多