2017-12-26 4 views
0

私は学習のためのシステムを作っています。Rails 5 with CanCanCan - インデックスアクションのリストをフィルタリングする方法

このシステムは、ユーザーの病院の移動を制御します。ユーザーは自分のシフトだけを見てください。

私はCanCanCanを認証制御に使用しています。インデックス・ページに対するので

私が持っているコントローラのアクション:

class Ability 
    include CanCan::Ability 

    def initialize(user) 
     if user 
      can :manage, Shift, user_id: user.id 
     end 
    end 
end 

私は:私が持っている能力で

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 %> 

ユーザーにシフトがない場合にメッセージを表示したい

しかし、リストが空ではないがシフトがない場合、現在のユーザは@shiftで空のメソッドを直接使用することができないので、インデックスhtmlページのcanメソッドを使用します。

ユーザコントローラのインデックスアクションでリストをフィルタリングできますか?

答えて

0

ここではいくつかの質問をしていますが、個別に回答するのは難しいので、私はあなたが持っていると信じている基礎的な質問に答えるために、より広範なアプローチをとるつもりです。

最初のこと:Cancancanは、データベースのクエリに関連することは何もしません。カンカンカンはそれをあなたに任せます。

私は@shiftsが定義されていないので、あなたのShiftsControllerにあると見なします。インデックスアクションは特定のユーザーのシフトを示すはずです。

通常、指定されたユーザーは、Railsアプリケーションではcurrent_userです。この認証は、Deviseなどによって行われます。あなたのアソシエーションが正しく設定されていれば、あなたはできるでしょう@shifts = current_user.shifts

しかし、例えば、RESTfulなルートが/users/:id/shiftsのように、ユーザーがシフトをフィルタリングしたい場合は、方法shiftsであなたのUsersControllerにマップする

resources :users do 
    member do 
    get :shifts => 'users#shifts' 
    end 
end 

:このように。

あなたのショーアクションで期待していた値の:id paramがあります。

@shifts = Shift.where(:user_id => params[:id])

あなたShiftsController#index法上のシフトをフィルタリングしたい場合さて、あなたはこのようなものかもしれない:

@shifts = Shift.where(:user_id => params[:user_id])

とあなたのURLが/shifts?user_id=1

、おそらく、次のようになります

ユーザーにシフトがない場合、@shiftsはデータベースと一致する行がないことを示す空の配列を返しますクエリ。あなたは `load_resource`または` load_and_authorize_resource`を使用する場合したがって、あなたはあなたのビューでいくつかの単純な論理を行うことができ、

<% if @shifts.empty? %> No shifts. <% else %> ... things to list shifts <% end %>

+1

'cancancan'はあなたのためのデータベースレコードをロードします。たとえば、インデックスアクションがある場合、cancancanは '@shifts = Shift.accessible_by(current_ability)'のようなことをします。この機能に関するドキュメントへのリンクは次のとおりです:https://github.com/CanCanCommunity/cancancan/wiki/authorizing-controller-actions –

関連する問題