Ruby on rails 带CanCanCan的Rails 5-如何筛选索引操作的列表

Ruby on rails 带CanCanCan的Rails 5-如何筛选索引操作的列表,ruby-on-rails,ruby,cancancan,Ruby On Rails,Ruby,Cancancan,我正在做一个学习用的系统 该系统为用户控制医院班次。用户应该只看到他的班次 我正在使用CanCanCan进行授权控制 因此,对于索引页,我有控制器操作: class UsersController < ApplicationController def index @users = User.all end end 如果用户没有任何班次,我想向他显示一条消息 但是在索引html页面中使用can方法,因为如果列表不是空的,但是没有移位,当前用户可以看到我不能

我正在做一个学习用的系统

该系统为用户控制医院班次。用户应该只看到他的班次

我正在使用CanCanCan进行授权控制

因此,对于索引页,我有控制器操作:

class UsersController < ApplicationController
    def index
        @users = User.all
    end
end
如果用户没有任何班次,我想向他显示一条消息

但是在索引html页面中使用can方法,因为如果列表不是空的,但是没有移位,当前用户可以看到我不能直接在@shift中使用空方法


是否可以在用户控制器的索引操作中过滤列表?

您在这里提出了几个不同的问题,很难单独回答,因此我将采取更广泛的方法,希望回答一些我认为您可能遇到的基本问题

首先:Cancancan不做任何与查询数据库相关的事情。坎坎坎让你来决定

我不知道在哪里定义了
@shifts
,所以我假设它在您的
ShiftsController
中,而索引操作应该显示给定用户的班次

给定的用户通常是Rails应用程序中的
当前用户
——这种身份验证是由Desive之类的东西完成的。如果关联设置正确,则可以执行
@shifts=current\u user.shifts

但是,如果您想(比如)按用户过滤班次,比如有一个RESTful路由
/users/:id/shifts
,那么您的路由如下所示:

resources :users do 
  member do
    get :shifts => 'users#shifts'
  end
end
这将映射到您的
用户控制器
,方法是
移位

在该方法中,您将有一个
:id
参数,该参数的值是您希望从show操作中获得的值

@Shift=Shift.where(:user_id=>params[:id])

现在,如果您想在
ShiftsController#index
方法上过滤移位,您可以有如下功能:

resources :users do 
  member do
    get :shifts => 'users#shifts'
  end
end
@Shift=Shift.where(:user\u id=>params[:user\u id])

你的URL大概看起来像是,
/shifts?user_id=1

现在,如果用户没有任何移位,
@shifts
将返回一个空数组-表示没有与数据库查询匹配的行。因此,你可以在你看来做一些简单的逻辑


无轮班。。。如果您使用
加载资源
加载和授权资源
,则要列出班次的内容可以加载数据库记录。例如,如果您有一个索引操作,cancancan会为您执行类似的操作:
@Shift=Shift.accessible\u by(当前能力)
。以下是有关该功能的文档链接:
resources :users do 
  member do
    get :shifts => 'users#shifts'
  end
end