如何限制用户搜索视图中的特定模型?

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 自定义角色定义的信息

【讨论】:

以上是关于如何限制用户搜索视图中的特定模型?的主要内容,如果未能解决你的问题,请参考以下文章

当特定 ViewController 类被推入另一个选项卡中的堆栈时,如何从堆栈中弹出视图控制器?

如何通过按下按钮上的文本输入搜索此树视图中的特定节点?

如何将用户控件(视图)中的逻辑剥离到演示者

限制 grafana 用户创建任何新文件夹

如何将用户定义的变量值限制为jmeter中的特定线程组

Django 权限取决于模型?