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



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

该系统控制用户的医院移动。用户只能看到他的轮班。

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

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

您在这里问一些不同的问题,很难单独回答它们,因此我将采取更广泛的方法,希望回答我的一些基本问题我相信你有。

第一件事是第一件事:坎坎坎不做与查询数据库有关的任何事情。坎坎卡人将其保留给您。

我没有看到@shifts在哪里定义的位置,所以我将假设它在您的ShiftsController中,而索引操作应该显示给定用户的偏移。

给定的用户通常是Rails应用程序中的current_user - 此身份验证是由Deseise之类的工作来完成的。如果您的关联正确设置,则可以进行@shifts = current_user.shifts

但是,如果您想过滤用户的换档(例如具有/users/:id/shifts的静止路线),您将拥有看起来像这样的路线:

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

将使用方法shifts映射到您的UsersController

在该方法内部,您将具有一个:id参数,其中您可以从展示动作中获得的值。

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

现在,如果您想在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 %>

最新更新