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