【问题标题】:Can I use authorization via CanCan in a form input collection?我可以通过 CanCan 在表单输入集合中使用授权吗?
【发布时间】:2023-08-21 18:32:01
【问题描述】:

我试图弄清楚如何将用户的:collection 限制为can? :manage, @article.website 的用户。如前所述,我正在使用 Cancan,我觉得我应该能够做这样的事情:

= f.input :user_id, collection: User.all unless cannot? :manage, @article.website

我使用的是 simple_form_for,因此是 f.input。有什么想法吗?

【问题讨论】:

    标签: ruby-on-rails authorization cancan simple-form ruby-on-rails-4


    【解决方案1】:

    CanCan 旨在回答“用户 U 可以做 X 吗?”这个问题。我不认为 cancan 旨在有效地回答“哪些用户可以做 X?”这个问题。理论上你可以这样做:

    User.all.select { |u| Ability.new(u).can?(:manage, @article.website) }
    

    但它的效率会非常低。

    除非您的用户数量很少,否则最好在 cancan 之外处理此问题。

    【讨论】:

      【解决方案2】:

      这不应该在视图中完成 - 在这种情况下,视图助手可能是最好的,但你应该只需要一个返回特定人可以看到的集合的条件。

      module SomethingHelper
      
        def something_user_ids(article)
          if can? :manage, article.website
            User.all
          else
            User.where(guest: true) # or whatever
          end
        end
      
      end
      

      那么在你看来,你只会做类似..

      = f.input :user_id, collection: something_user_ids(@article)
      

      【讨论】: