🍙
【Rails/CanCanCan】関連付けを利用したload_resource
はじめに
CanCanCan は Ruby on Railsの認可ライブラリで、特定のユーザーがアクセスできるリソースを制限できる機能があります。
今回は、コントローラで関連付けを利用してリソース読み込みを行うload_resource
のthrough
オプションについて紹介します。
使い方
コントローラで以下のように記述すると、author
リソースを通じたリソースの読み込みが行われ、アクションに応じて@books
や@book
がセットされます。(コントローラにインスタンス変数@author
やメソッドauthor
の定義が必要)
class BooksController < ApplicationController
load_resource through: :author
end
リソース読み込みの流れ
実際にLibraryの該当箇所のコードを見ていきます。
処理は大きく分けて以下の2段階に分かれます
- 親リソースの取得
- 子リソースの読み込み
親リソースの取得
親リソースの名前parent_name
をもとに、コントローラのインスタンス変数を確認し、存在しない場合は同名のメソッド呼び出しを行います。
子リソースの読み込み
今回は、show
, edit
, destroy
アクションの場合を考えていきます。
load_resource_instance
の中でfind_resource
が呼び出されます。
singleton
やfind_by
オプションを設定しない、三つ目の条件分岐を通る場合を考えます。
今回の設定ではresource_base
の部分で以下が行われます
- 前述の
parent_resource
により親リソース@author
の取得が行われる -
send
メソッドにより、@author
に対してコントローラ名の複数形books
メソッドを呼び出す
これにより、@author.books
の結果から、id_param
で指定された ID
に一致するリソースを検索する処理が行われます。
まとめ
- コントローラーで
load_resource through: :<インスタンス変数名>/<メソッド名>
と記述することで、関連付けを利用したリソース読み込みが可能
Discussion