権限承認用にCanCanCommunity/cancancanを入れていましたが、load_resource
が多機能で、認証不要な場面でも使いたくなるものでした1。
デフォルトの機能性
デフォルトでは、こんな動きをします。
class ItemsController < ApplicationController
load_resource
end
このように書いておくと、以下の動きをします。
-
new
アクション→@item
にItem.new
をしたものが入り、なおかつ権限設定上必須となる値がセットされる -
create
アクション→new
で行われる初期化処理にプラスして、params
の解釈用に用意してあるメソッド(後述)を呼び出して@item
を変更する -
index
アクション→@items
にItem.accessible_by(current_ability)
が入る -
show
・edit
・destroy
、基本7つ以外のアクション…@item
にItem.find_by(params[:id])
が入る -
update
アクション…上のように@item
が回収された上で、params
の解釈用に用意してあるメソッド(後述)を呼び出して@item
を変更する
これだけしてくれるので、アクション内で書くコードは大幅に減少します。new
アクションなどは、空っぽになってしまうこともありえます。
自動で呼び出すparams
メソッド
以下のような優先順位で、存在するメソッドが呼び出されます。全てなければ何も起きません。
-
load_resource
のオプションでparam_method: :method_name
のように指定した名前 #{アクション名}_params
#{リソース名}_params
resource_params
カスタマイズする
もちろん、レールに乗っかってデフォルトの設定で使うのが楽なのは間違いないですが、そうは問屋が卸さない場面も多々あります。そのような場合は、自分で上書きすることもできます。
先に自分でロードする
一部のアクションだけ自分でロードしたい場合には、load_resource
の前にbefore_action
で@item
をセットすれば、load_resource
によるロードはバイパスされます。
ネストする
ネストしたリソースの場合、load_resource
を複数重ねることで両方をロードさせることができます。長くなりそうなので、詳しくは公式のWikiを見てください。
引数指定
load_resource
に引数を足すことで、デフォルトでは名前から暗黙に設定されていた変数やクラス名も、手動設定できます。
-
only:
、except:
…before_action
に付ける同様の引数のように、アクションごとにload_resource
を適用するかしないかを切り替えます。 -
through:
、through_association
、shallow:
、singleton:
、parent:
…リソースネスト関連のパラメーターです(詳細略)。 -
class:
…モデルのクラスを文字列、あるいは定数で指定します。 -
instance_name:
…インスタンス変数の名前を変更します(先頭の@
は不要です)。コレクションの変数も、これの複数形になります。 -
find_by:
…モデル1つの取得をfund_by_#{find_by}!
メソッドで行うように切り替えます。 -
id_param:
…モデルを特定する引数をparams[:id]
以外に切り替えます。 -
collection:
…index
以外の、コレクションを取得するアクションを指定します。 -
new:
…new
、create
以外でモデルを新規作成するアクションを指定します。
-
ただし、
can :manage, Model
のようにきちんと素通しにする形でセットしておかないと、うまく動きません。 ↩