2014-11-13 5 views
1

장부 has_many 장. 사용자 has_many Books.Cancan 및 has_many 관계를 사용하는 경우 : create

저는 devise와 cancancan을 사용하고 있습니다. 사용자가 자신이 소유 한 모든 책에 대해 장을 만들 수 있도록하고 싶습니다. 오브젝트가 작성 될 때까지 있기 때문에 만듭니다 전무 방법을 던졌습니다 :

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

은 괜찮지 만에이 사용하는 - 그렇게 ability.rb에 존재 때까지 내 문제는 제 책에 속하지 않는있다 속성이 없습니다. 나는 컨트롤러에서 생성 작용에 체크를 넣어에 의지 한 - 괜찮

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

을 ...하지만, 바로, 더 나은 방법이있을거야? 이러한 경우

답변

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 } 
+0

안녕 blelump - 당신은 당신의 두 번째 코드 블록에서 무슨 일이 일어나고 있는지 나에게 설명 할 수 있을까? Rails는 해시에있는 책이 해당 장이 속한 책이라는 것을 알고 있습니까? – RADan

+0

네, 그렇습니다. 특정 자원에 대해서만 권한을 정의하는 것은 일반적인'cancancan '접근 방식입니다. 예를 들어 [here] (https://github.com/CanCanCommunity/cancancan/wiki/Defining-Abilities#user-content-hash-of-conditions)를보십시오. 즉, 최후의 수단에서만 블록을 사용하십시오. 시간이 더 많이 걸리기 때문에 비용이 많이 들기 때문입니다. 대신 주어진 권한 연결과 일치하는 해시를 사용하십시오. 때로는 단순하지 않고 블록이 유일한 선택 인 경우도 있지만, 컨텍스트를 해시로 정의하는 것이 좋습니다. 추신. 'cancancan'으로 전환하면'cancan'이 죽었습니다. – blelump

+0

정말 감사합니다, 설명 주셔서 감사합니다. 나는 cancancan을 사용하고 있으며 그에 따라 q를 수정할 것입니다. :) – RADan