如何限制用户搜索视图中的特定模型?
Posted
技术标签:
【中文标题】如何限制用户搜索视图中的特定模型?【英文标题】:How to restrict user to search for a particular model in view? 【发布时间】:2015-09-01 05:44:31 【问题描述】:我正在工作的应用程序具有不同的用户角色客户、项目经理和超级用户,并且在登录页面上他们可以搜索文章,并且有一个高级过滤器可以在搜索后过滤掉记录。 喜欢:按作者过滤。
我想为客户隐藏高级过滤器,因为我想使用 cancancan 来定义能力。
目前我正在使用模型方法。这些方法根据用户类型返回 true 和 false。
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?
但这限制了所有用户进行过滤。
【问题讨论】:
@pradeepDhingra。如果 user.client 不能:过滤,文章?这行应该只限制客户端你能告诉我们它是如何限制所有用户的吗? @Prabhakar 它没有为所有用户显示高级搜索链接。这是我的问题,它不应该限制所有用户。早些时候它为除客户端以外的其他用户显示链接,但在应用 cancan 后,它限制了所有用户.. 【参考方案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
【讨论】:
unless user.client? can :filter, Article end
这是可行的,但为什么不使用cannot
。
因为cannot
实际上不允许任何用户做任何事情。它只是声明了用户不能做的事情。
我认为您对条件的工作方式有点困惑,cannot :filter, Article if user.client?
只有在满足if user.client?
的谓词时才会运行cannot :filter, Article
。它不执行创建can
权限的相反操作。就像puts 'hello' if user.client?
cannot
可以用于如果您需要有一个不应该授权用户执行操作的特定规则。您可以使用它来代替 can
声明中的一堆条件。
在我看来,视图的多个部分受限于不同的用户角色。过滤器就是其中之一。您对提高可读性和可维护性有何建议?像过滤器一样,我应该为所有不同的部分创建can
能力..或任何其他建议..【参考方案2】:
你可以试试这个
# 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
上面的过滤器会让只有客户端或超级用户可以过滤东西。
【讨论】:
你读过这个问题吗? OP 没有指定他正在使用任何角色或角色库。【参考方案3】:如下改变角色
can :filter, Article unless user.client?
您可以从here 阅读有关 cancan 自定义角色定义的信息
【讨论】:
以上是关于如何限制用户搜索视图中的特定模型?的主要内容,如果未能解决你的问题,请参考以下文章