情境特定的康康角色

时间:2014-09-15 15:35:50

标签: ruby-on-rails ruby-on-rails-4 cancan

:user has_many :books
:book belongs_to :user
:book has_many :contributions
:user has_many :contributions
:contribution belongs_to :book
:contribution belongs_to :user

我希望能够控制/ books / show中的行为,具体取决于用户是否是该书的撰稿人。在康康舞中,我的目标是 -

can :contribute, Book if @book.contributions.include?(user_id)

那行代码是错误的,(nil:NilClass的未定义方法`贡献')但是有没有正确的方法来放置它,或者我是否想要深入研究它?

1 个答案:

答案 0 :(得分:2)

定义异能时,您应该使用hash of conditionsblock of code。在你的情况下,这应该工作:

can :contribute, Book do |book|
  book.contributions.include?(user_id)
end

然后,当您在控制器或视图中定义授权时,如readme中所述,您可以传递@book变量,该变量将在您的能力定义中传递给阻止,如:

authorize! :contribute, @book

<% if can? :contribute, @book %>