我可以通过CanCan在表单输入集合中使用授权吗?

问题描述:

我想弄清楚如何将用户的:collection限制为那些谁can? :manage, @article.website。如前所述,我使用惨惨的,我觉得我应该可以做这样的事情:我可以通过CanCan在表单输入集合中使用授权吗?

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

我使用simple_form_for因此f.input。有任何想法吗?

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

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

但它会是可怕的低效率。

除非你的用户数量非常少,否则你最好在cancan之外处理这个问题。

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

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)