Controllerのコールバックメソッド(before/after_action)


目的

Ruby on Railsでアプリを使用する際にコールバックメソッドを使用するが、詳細まで理解する必要があると思ったため備忘録的に残しておく。

コールバックメソッドとは

オブジェクトの特定のタイミングで呼び出されるメソッドのこと。
その中でもよく使われるbefore/after_actionを紹介する。

before_action,after_actionとは

Controllerでbefore_actionを定義することで、アクションの前後に処理(フィルター)を差し込むことが可能になります。
一般的に、複数のアクションで共通して必要になる処理などを定義することが多い。

before_actionの使い方

Controllerにbefore_actionとして処理したいメソッドを定義します。
※after_actionも使い方は同一です。

blogs_controller.rb
class UsersController < ApplicationController
  before_action :set_blog
  ・・・
  def set_blog
    @blog = "before_actionの学習中"
  end
end
show.html.erb
<h1>Listing Users</h1>
<p>before_actionで定義した@blog: <%= @blog.id %></p>  <! ←この行を追加 >
<table>

</table>
<br><img width="653" alt="スクリーンショット 2019-10-10 22.45.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/509302/2ad90bd9-5974-cf20-9eff-eebef1b4de1b.png">

<%= link_to 'New User', new_blog_path %>

アプリケーションを起動した画面が以下になります。
上記で定義したset_blogメソッドの@blogの値が表示されていますね。
これによりアクションの前に処理を差し込むことができました。

only,excect,if,unlessオプション

railsの他のメソッド同様にオプションを持っています。

class UsersController < ApplicationController
  before_action :set_blog, only:[:new, edit]
end

上記のようにonlyオプションを使って書いた場合set_blogはnew,editアクションの前だけで実行されます。
exceptオプションは逆で指定したアクション以外でbefore_actionを実行します。

また、ifオプションはラムダを渡すことによって式がtrueの時だけ実行させることができます。
unlessオプションは式がtrue以外の時だけ実行される。

class UsersController < ApplicationController
# current_user.editable?がtrueの時に 
  before_action :set_blog, if: -> { current_user.editable? }
end

まとめ

・before/after_actionはControllerの前後に処理を差し込むことができる
・only,except,if,unlessオプションを使うことで条件付きでコールバックを使用できる