2012-11-06 2 views
0

사용자는 조직에 속해 있습니다. 사용자는 모든 조직을 볼 수 있지만 조직 내의 사용자 만 볼 수 있습니다. 사용자가 조직을 볼 때 뷰에 필터 논리를 추가해야하므로 @organizations.users@organizations.users.select{|u| can?(:read, u)}이됩니다.사용자 CanCan 기능을 기반으로 모델의 관련 컬렉션 필터링

더 투명하거나 우아하게 관리 할 수있는 방법이 있습니까? select{|u| can?(:read, u)}을 없애거나 DRY 장소로 옮길 수있는 방법이 있습니까?

관련 코드 :

class Organization < ActiveRecord::Base 
    has_many :users 
    ... 
end 

class Ability 
    ... 
    can :read, User, :organization => @user.organization 
end 

조직/show.html.erb : (현재, 짜증나 버전)

<% if @organization.users.select{|u| can?(:read, u)}.any? %> 
    <h4>Contacts</h4> 
    <ul class="unstyled"> 
    <% for user in @organization.users.select{|u| can?(:read, u)} %> 
     <li> 
     <%= link_to user, user, class: "user" %> 
     </li> 
    <% end %> 
    </ul> 
<% end %> 

내가 대신이보기에 가까운 무언가 원하는 :

을 organizations/show.html.erb :

,210

업데이트 : 블록을 사용하는 능력의 정의를 가지고 있기 때문에

내가 accessible_by을 방지하고 있습니다.

class Ability 
    ... 
    can :read, User, :organization => @user.organization 
    can :read, User do |user| 
    user.is? :technical_contact 
    end 
end 

나는 accessible_by는하지만 SQL 조각이 제공되는 경우에만, 블록으로 작업 할 수 있다는 것을 알고. 사용자는 많은 역할을하고 비트 마스크로 저장되기 때문에 SQL 조각이 없습니다.

답변

0

CanCan은 활성 레코드 모델에서 사용할 수있는 accessible_by 메서드를 사용하여이 기능을 지원합니다.

자세한 내용은 https://github.com/ryanb/cancan/wiki/Fetching-Records을 참조하십시오.

+0

이것은 좋은 제안이지만 블록을 사용하는 능력 정의가 있기 때문에'accessible_by'를 피합니다. 내가 명확하게 질문을 업데이 트하지만, 내 시나리오에 대한 더 좋은 방법이 있다면 귀하의 답변을 수락하거나 적어도 투표. – Anson

관련 문제