繁体   English   中英

带有CanCanCan的Rails 5-如何为索引操作过滤列表

[英]Rails 5 with CanCanCan - How to filter list for an index action

我正在建立一个用于学习目的的系统。

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

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

因此,对于索引页,控制器具有以下操作:

class UsersController < ApplicationController
    def index
        @users = User.all
    end
end

在index.html.erb中

<% @shifts.each do |shift| %>
    <% if can? :read, shift %>
      <tr>
          <td><%= shift.date %></td>
      </tr>
    <% end %>
<% end %>

我具有以下能力:

class Ability
    include CanCan::Ability

    def initialize(user)
        if user
            can :manage, Shift, user_id: user.id
        end
    end
end

如果他没有任何班次,我想向用户显示一条消息。

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

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

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

第一件事是:Cancancan不会做任何与查询数据库有关的事情。 Cancancan取决于您。

我没有看到@shifts的定义位置,所以我假设它位于您的ShiftsController -而index操作应该显示给定用户的班次。

给定的用户通常是Rails应用程序中的current_user这种身份验证是通过诸如Devise之类的方式完成的。 如果您的关联设置正确,则可以执行@shifts = current_user.shifts

但是,例如,如果要按用户过滤班次,例如使用RESTful路由/users/:id/shifts ,您将拥有如下所示的路由:

resources :users do 
  member do
    get :shifts => 'users#shifts'
  end
end

它将通过shifts映射到您的UsersController

在该方法内,您将具有一个:id参数,该参数具有您希望通过show动作获得的值。

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

现在,如果您想过滤ShiftsController#index方法上的ShiftsController#index ,则可以有以下内容:

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

并且您的URL大概应该是/shifts?user_id=1

现在,如果用户没有任何班次, @shifts将返回一个空数组-表示没有与您的数据库查询匹配的行。 因此,您可以在视图中执行一些简单的逻辑,

<% if @shifts.empty? %> No shifts. <% else %> ... things to list shifts <% end %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM