사용자는 조직에 속해 있습니다. 사용자는 모든 조직을 볼 수 있지만 조직 내의 사용자 만 볼 수 있습니다. 사용자가 조직을 볼 때 뷰에 필터 논리를 추가해야하므로 @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 조각이 없습니다.
이것은 좋은 제안이지만 블록을 사용하는 능력 정의가 있기 때문에'accessible_by'를 피합니다. 내가 명확하게 질문을 업데이 트하지만, 내 시나리오에 대한 더 좋은 방법이 있다면 귀하의 답변을 수락하거나 적어도 투표. – Anson