【问题标题】: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)