0

ユーザーは組織に属しています。ユーザーはすべての組織を表示できますが、表示できるのは組織内のユーザーのみです。ユーザーが組織を表示するとき、ビューにフィルターロジックを追加する必要があるため、に@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フラグメントはありません。

4

1 に答える 1

0

CanCanはaccessible_by、アクティブレコードモデルで利用可能なメソッドを使用して、これをサポートするように組み込まれています。

詳細については、 https://github.com/ryanb/cancan/wiki/Fetching-Recordsを参照してください。

于 2012-11-06T15:58:03.263 に答える