我正在制作一个用于学习目的的系统。
该系统控制用户的医院移动。用户只能看到他的轮班。
我正在使用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 %>