ユーザーは組織に属しています。ユーザーはすべての組織を表示できますが、表示できるのは組織内のユーザーのみです。ユーザーが組織を表示するとき、ビューにフィルターロジックを追加する必要があるため、に@organizations.users
なり@organizations.users.select{|u| can?(:read, u)}
ます。
これをより透過的またはエレガントに管理する方法はありますか?それを取り除くselect{|u| can?(:read, u)}
か、乾燥した場所に移動する方法はありますか?
関連コード:
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 %>
代わりに、このビューに近いものが必要です。
組織/show.html.erb:
<% if @organization.users.any? %>
<h4>Contacts</h4>
<ul class="unstyled">
<% for user in @organization.users %>
<li>
<%= link_to user, user, class: "user" %>
</li>
<% end %>
</ul>
<% end %>
アップデート:
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フラグメントはありません。