簡體   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