こんにちは。
本記事は、プログラミング言語「Ruby」のフレームワーク「Rails」でよく利用するメソッド、「before_action」について解説致します。
【目次】
例題
before_actionメソッドを使った例として、次のコードをみてください。
```Rails(Ruby)
1 class ApplicationController < ActionController::Base
2 before_action :configure_permitted_parameters , if: :devise_controller?
3
4 def configure_permitted_parameters
5 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :avatar])
6 end
7 end
```
上記のクラスですが、何を実現しているのか?1行毎に解説していきますね。
解説
```Rails(Ruby)
1 class ApplicationController < ActionController::Base
2 before_action :configure_permitted_parameters , if: :devise_controller?
```
まず1行目は、「ApplicationControllerクラスがActionControllerクラスを継承する」という意味のコードです。
ActionControllerクラスで作成したメソッドが、ApplicationControllerでも使用できる機能をもった「継承」です。
そして2行目に、今回メインで解説するbefore_actionメソッドが使われています。
before_action = 直訳してみると「前のアクション」・・・??
全然ピンと来ないですね、すみません。
つまりこれは、それぞれのアクション(メソッド)を実行する前に呼ばれるメソッドです。
例えば、
```Rails(Ruby)
1 class ShoppingController
2 before_action : ログインを確認するメソッド
3
4 def 商品を閲覧するメソッド
5 〜閲覧するコードを記載〜
6 end
8
9 def 商品を登録するメソッド
10 〜登録するコードを記載〜
11 end
12
13 def 商品を削除するメソッド
14 〜削除するコードを記載〜
15 end
16 end
```
上記のShoppingControllerクラスがあるとしますと、商品閲覧メソッド(4〜6行目)・登録メソッド(9〜11行目)・削除メソッド(13〜15行目)を呼び出す前には、必ずbefore_actionメソッド(2行目)が先に呼ばれるという事です。
しかし、注意すべき箇所があります。
今回例題として挙げた、
```Rails(Ruby)
1 class ApplicationController < ActionController::Base
2 before_action :configure_permitted_parameters , if: :devise_controller?
3
4 def configure_permitted_parameters
5 devise_parameter_sanitizer.permit(:sign_up, keys: [:nickname, :avatar])
6 end
7 end
```
上記のbefore_actionメソッドには、「if: :devise_controller?」のコードがありますよね。
この場合のコードが意味するのは、
❗️アクション(メソッド)を呼び出す時、そのアクションが所属するコントローラー名が「devise_controller」であれば、before_actionの中身が実行されるという流れです。
具体例として、devise_controller内に存在するTestメソッドがあるとしましょう。
このTestメソッドを呼ぶ時に、まずbefore_actionメソッドが先に呼ばれますが、 Testメソッドはdevise_controller内にあります。
その結果、before_actionの横に書いているconfigure_permitted_parametersメソッドを呼び出せるという仕組みです。
尚、devise_controller以外のコントローラーに所属するアクションが実施された場合は、before_actionの横に書いているconfigure_permitted_parametersメソッドは、実行されません。
上記の感じで、before_actionを応用した使い方もありますので、是非頭に入れてもらえればと思います。
補足
configure_permitted_parametersの中で、devise_parameter_sanitizerが実行されるが、これはストロングパラメータのdevise版。
サインアップ(新規会員登録などを意味します)時に、nicknameとavatarカラムへの保存を許可するようになります。
deviseのコントローラーは、デフォルトではアプリケーション内に作成されません。
興味がある方は、GitHubでソースコードを確認するとdeviseのコントローラーがApplictaionControllerを継承していることが確認できます。
これを使えば、ログイン機能も効率よく実装できますね!
まとめ
before_actionを使う理由はご存知ですか??
例えば、開発していく上で必ず、複数のアクション内で共通の処理を実行しなけらればならないという状況が発生します。
この状況を打開するためにあるのが、「before_action」メソッドです。
これを書くことで、アクションを実行する前に共通の処理を書いたメソッド(before_actionに記載したメソッド)を自動で実行してくれます。
同じコードを書く手間が省け、開発効率もあがりますよ。
ぜひ、覚えておきたいメソッドですね!
以上になります、参考になれば幸いです。
ありがとうございました。