4.3 フィルター
アクション前に処理を追加する
コントローラのアクションが実行される前に処理を追加したい場合はbefore_action
メソッドを使います。
before_action
に実行したいメソッドのシンボルを渡します。
以下の例はアクションが呼ばれる前にログインが済んでいるかのチェックを実施しています。
class PostsController < ActionController::Base
before_action :authenticate
def create
@post = Post.create
end
private
def authenticate
unless signed_in?
redirect_to signin_url
end
end
end
アクション後に処理を追加する
コントローラのアクションが実行された後に処理を追加したい場合はafter_action
メソッドを使います。
after_action
に実行したいメソッドのシンボルを渡します。
以下の例はアクションが呼ばれた後にページビューを加算しています。
class PostsController < ActionController::Base
after_action :increment_pageview, only: [:show]
def show
@post = Post.find(params[:id])
end
private
def increment_pageview
@post.pageview += 1
end
end
アクション前後に処理を追加する
around_action
メソッドを利用するとアクションの前後に処理を入れることができます。
このとき本来のアクションは明示的にyield
で呼び出す必要があります。
class PostsController < ApplicationController
around_action :logging
private
def logging
logger.debug "アクションの前に実行される"
yield
logger.debug "アクションの後に実行される"
end
end
フィルターをスキップする
before_action
、after_action
、around_action
にはそれぞれskip_before_action
、skip_after_action
、skip_around_action
が用意されています。
これらを使うことでフィルタをスキップすることができます。