首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >根据用户的CanCan能力筛选模型的关联集合

根据用户的CanCan能力筛选模型的关联集合
EN

Stack Overflow用户
提问于 2012-11-06 15:53:07
回答 1查看 660关注 0票数 0

用户属于组织。用户可以查看所有组织,但只能查看组织中的用户。当用户查看组织时,我必须向视图中添加筛选逻辑,这样@organizations.users就变成了@organizations.users.select{|u| can?(:read, u)}

是否有一种更透明或优雅的方法来管理这一问题?有没有办法摆脱select{|u| can?(:read, u)}或者把它移到干燥的地方?

相关代码:

代码语言:javascript
运行
复制
class Organization < ActiveRecord::Base
  has_many :users
  ...
end

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

organizations/show.html.erb:(当前的、糟糕的版本)

代码语言:javascript
运行
复制
<% 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:

代码语言:javascript
运行
复制
<% 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,因为我有一个使用块的能力定义。

代码语言:javascript
运行
复制
class Ability
  ...
  can :read, User, :organization => @user.organization
  can :read, User do |user|
    user.is? :technical_contact
  end
end

我知道accessible_by可以使用块,但前提是提供了一个SQL片段。因为我的用户有许多角色,并且作为位掩码存储,所以我没有SQL片段。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-06 15:58:03

CanCan已经通过在活动记录模型上可用的accessible_by方法构建了对此的支持。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13254639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档