カテゴリー:
Rails
タグ:
 Rails helper_method

このエントリーをはてなブックマークに追加
更新日時:
2014年01月20日(月)
作成日時:
2014年01月20日(月)

前の記事 / 次の記事

参考: 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

ビュー

-# haml
- if logged_in?
  %p
    %span=current_user.name
    %span=link_to "ログアウト", logout_path
- else
  %p
    %span=link_to "ログイン", login_path

コントローラーの中で該当のメソッドがpublic になっているか private になっているかは関係ない。
private でも public でもヘルパーメソッドにできる。

使いどころがいまいちよく分かってないんだけど、
コントローラー独自の変数が生まれる場合はヘルパーにするとスマートなのかも知れない。

また、ヘルパーメソッド化した場合は、インスタンス変数に値を格納した場合と較べて
フィルターのことを考慮しなくていいという点でかなり便利だと思う。

例えば、

インスタンス変数に値を格納した場合

コントローラー

before_action :set_current_user, only: [:index, :show]

def set_current_user
  @current_user ||= User.find(session[:user])
end

ビュー

-# index.html.haml
%p=@current_user.name

-# show.html.haml
%p=@current_user.name

もし index, show アクション以外でも @current_user を使いたい場合は、
フィルターの only: オプションに指定を追加する必要がある。

また、only: オプションを指定しない場合は @current_user が必要のないアクションでも
@current_user は必ずロードされるのでなんかキモい。

ヘルパーメソッド化した場合

コントローラー

helper_method :current_user

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

ビュー

-# index.html.haml
%p=@current_user.name

-# show.html.haml
%p=@current_user.name

index, show アクション以外でも current_user を使いたい場合、
その他のアクションの View で current_user と書けばいい。

書けばロードされるし、書かなければロードされない。

ヘルパーメソッド化した場合は、全てのアクションから呼び出せるようになるので、
指定したアクション以外から呼ばれると困る場合はやっぱりフィルターを利用する必要があるけど、

指定したアクション以外から呼ばれても困らないけど、
効率を考えて不要な場合はロードさせたくないというような場合は
ヘルパーメソッド化してしまうと便利。