2

我正在工作的应用程序具有不同的用户角色客户、项目经理和超级用户,并且在登录页面上他们可以搜索文章,并且有一个高级过滤器可以在搜索后过滤掉记录。喜欢:按作者过滤。

我想为客户隐藏高级过滤器,因为我想使用cancancan定义能力。

目前我正在使用模型方法来做这件事。这些方法根据用户类型返回真假。

client?
project_manager?
super_user?

当前代码:

<% unless current_user.client? %>
   <%=link_to "Advance Search", "#" %>
<%end%>

我想删除它并使用 cancancan 代替它。

<%if can? :filter, Article %>
  <%=link_to "Advance Search", "#" %>
<%end%>

为此,我尝试了

cannot :filter, Article if user.client?

但这限制了所有用户进行过滤。

4

3 回答 3

1

您需要声明一个can规则以实际允许用户:filter.

can :filter, Article do |article|
  !user.client?
end

或者

unless user.client?
  can :filter, Article
end

使用示例cannot

can :friend, User

cannot :friend, User do |other_user|
  other_user.blocks?(user)
end
于 2015-06-16T12:27:00.527 回答
0

稍微改变一下角色如下

can :filter, Article unless user.client?

您可以从这里阅读关于 cancan 的自定义角色定义

于 2015-06-16T12:43:44.293 回答
-1

你能试试这个

# in models/user.rb
def is?(role)
  roles.include?(role.to_s)
end

# in models/articles.rb
can :filter, :all if user.is? :client || :super_user

上面的过滤器将使只有客户端或超级用户可以过滤这些东西。

于 2015-06-16T12:31:48.907 回答