@ledsun blog

無味の味は佳境に入らざればすなわち知れず

コントローラーでもビューでも呼び出せるヘルパーメソッドを作るにはhelper_methodを使う

root_user?みたいた権限チェックするメソッドを定義したいです。 権限チェックするメソッドはビューでもコントローラーでも使いたいことが多いです。

  • ビューでは権限によって項目を表示したりしなかったり切り替えたい
  • コントローラーでは権限があるときだけアクションを実行し、ない時はアクションを実行したくない

こういうときはApplicationControllerにメソッド定義してAbstractController::Helpers#helper_methodを使ってビューから呼べるようにします。

AbstractController::Helpers::ClassMethods にまさにそんな例があります。

class ApplicationController < ActionController::Base
  helper_method :current_user, :logged_in?

  def current_user
    @current_user ||= User.find_by(id: session[:user])
  end

  def logged_in?
    current_user != nil
  end
end

Devise Gemcurrent_userメソッドにもhelper_methodは使われています。

https://github.com/heartcombo/devise/blob/8593801130f2df94a50863b5db535c272b00efe1/lib/devise/controllers/helpers.rb#L77

if respond_to?(:helper_method)
  helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?"
end

なんとなく「ヘルパーモジュールに定義したものをApplicationControllerから呼ぶのかな?」と想像していました。 逆だったので、ちょっと驚きました。

参考