2

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

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

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

4

2 回答 2

3

CanCan 旨在回答“用户 U 可以做 X 吗?”这个问题。我不认为 cancan 旨在有效地回答“哪些用户可以做 X?”这个问题。从理论上讲,您可以执行以下操作:

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

但这将是非常低效的。

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

于 2013-07-23T05:50:35.293 回答
0

这不应该在视图中完成 - 可能视图助手最适合这种情况,但您应该只具有返回特定人可以看到的集合的条件。

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)
于 2013-07-23T05:52:46.417 回答