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 Gemのcurrent_user
メソッドにもhelper_method
は使われています。
if respond_to?(:helper_method) helper_method "current_#{group_name}", "current_#{group_name.to_s.pluralize}", "#{group_name}_signed_in?" end
なんとなく「ヘルパーモジュールに定義したものをApplicationControllerから呼ぶのかな?」と想像していました。 逆だったので、ちょっと驚きました。
参考
- Rails / Controllerに関するTips | 酒と涙とRubyとRailsと
- viewからcontrollerのメソッドをhelper_methodで呼び出す - Qiita
- [メモ][Rails]コントローラーのメソッドをヘルパーとしてビューで使う - Qiita
- ヘルパーメソッドをつくろう - kc-masuo’s diary
- ruby on rails - Can we call a Controller's method from a view (as we call from helper ideally)? - Stack Overflow
- Rails: 提案「コントローラから`@`ハックを消し去ろう」(翻訳)|TechRacho by BPS株式会社