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

问题描述 投票:0回答:1

我正在制作一个用于学习目的的系统。

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

我正在使用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中直接使用空方法。

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

ruby-on-rails ruby cancancan
1个回答
0
投票

你在这里问了几个不同的问题,而且很难单独回答,所以我会采取更广泛的方法,希望能回答一些我认为你所拥有的基本问题。

第一件事是第一件事:Cancancan不会做任何与查询数据库有关的事情。 Cancancan留给你的。

我没有看到@shifts定义在哪里,所以我将假设它在你的ShiftsController中 - 而索引动作应该显示给定用户的转变。

给定用户通常是Rails应用程序中的current_user - 此身份验证由诸如Devise之类的东西完成。如果你的关联设置正确,你就可以做@shifts = current_user.shifts

但是,如果您希望按用户过滤转换 - 例如使用RESTful路由的/users/:id/shifts - 您将拥有如下所示的路由:

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

UsersController方法映射到你的shifts

在这个方法中,你有一个:id param,其值与你对show动作的期望值相同。

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

现在,如果你想过滤你的ShiftsController#index方法的转变,你可能会有这样的事情:

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

你的网址看起来像是/shifts?user_id=1

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

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

© www.soinside.com 2019 - 2024. All rights reserved.