[英]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.