2

저는 :collection 사용자를 can? :manage, @article.website으로 제한하는 방법을 알아 내려고하고 있습니다. 언급 한 바와 같이 나는 캉캉를 사용하고 있는데 나는 같은 것을 할 수있을 것 같은 느낌 : 나는 따라서 f.input simple_form_for 사용하고양식 입력 컬렉션에서 CanCan을 통한 승인을 사용할 수 있습니까?

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

. 어떤 아이디어?

답변

3

CanCan은 "can can U U X?"라는 질문에 대답하도록 고안되었습니다. Cancan은 "사용자가 X를 할 수 있습니까?"라는 질문에 효율적으로 대답하도록 설계되지는 않았다고 생각합니다. 이론적으로는 다음과 같이 할 수 있습니다.

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

그러나 엄청나게 비효율적입니다.

사용자 수가 매우 적은 경우가 아니면 cancan 외부에서 처리하는 것이 좋습니다.

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) 
관련 문제