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

accessible_byCanCan使用您的活动记录模型上可用的方法内置了对此的支持。

有关更多信息,请参阅https://github.com/ryanb/cancan/wiki/Fetching-Records

于 2012-11-06T15:58:03.263 回答