我正在制作一个用于学习目的的系统。
该系统控制用户的医院转移。用户应该只看到他的班次。
我正在使用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中直接使用空方法。
是否可以过滤用户控制器中索引操作中的列表?
你在这里问了几个不同的问题,而且很难单独回答,所以我会采取更广泛的方法,希望能回答一些我认为你所拥有的基本问题。
第一件事是第一件事: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 %>