Cancan和使用has_many关系:create

时间:2014-11-13 08:40:53

标签: ruby-on-rails devise cancancan

一本书有很多章节。用户has_many Books。

我正在使用设计和cancancan,我想让用户:为他们拥有的任何书创建章节。我的问题是,章节不属于一本书,直到它存在于ability.rb -

can [:read, :update, :destroy], Chapter do |chapter|
  chapter.book.user_id == user.id
end

很好,但是使用它:create会抛出一个nil方法,因为在创建对象之前,它没有任何属性。我已经使用了一个检查控制器中的创建动作 -

if @chapter.book.user == current_user && @chapter.save

......这很好,但必须有更好的方法,对吧?

1 个答案:

答案 0 :(得分:2)

在这种情况下,您可以使用:

     # or just :manage
can [:read, :update, :destroy, :create], Chapter do |chapter| 
  chapter.new_record? || chapter.book.user_id == user.id
end

但是,我会稍微简化一下:

can :manage, Chapter, book: { user_id: user.id }