Railsで共通メソッドの作り方

  • コントローラ全体の共有のメソッドを追加する

異なるコントローラ間で共通に使用するメソッドは, ApplicationControllerクラスで定義します。
各コントローラは, 原則としてApplicationControllerを継承しているのでここ(app/controllers/application.rb)で定義すればどのコントローラでも使えます。
なにかしらのアプリケーションでのアカウント, ログイン情報なんかを判別するときに使うと便利です。
例:セッションの :user_id をもとにログインしてるユーザ情報を取得するcurrent_userメソッドを作るとこんな感じです。

class ApplicationController < ActionController::Base
  protect_from_forgery  

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

  #戻り値がt/fとなるときはメソッドに?をつける
  def signed_in?
    current_user
  end

  #オブジェクトそのものを書き換えるときは!をつける(破壊的メソッド)
  def sign_out!
    session.delete :user_id
  end
end
  • コントローラのメソッドをビューからも使う

さらにコントローラで定義したメソッドをビューからも使うこともできます。
その時は, helper_method メソッドを宣言するだけです。
引数として使いたいメソッドの名前を指定します。

class ApplicationController < ActionController::Base
  protect_from_forgery  
  helper_method :current_user, :signed_in?, :sign_out!
#略...

View側ではこんなかんじで使えます。

<% if signed_in? %>
  <li><%= image_tag @icon , size: '24x24'%></li>
  <li><%= @user.name %></li>
  <li><%= link_to "Sign out",sessions_destroy_path, :method => :delete %></li>
<% end %>

ログインしているときは, アイコンとユーザの名前、Sign outへのリンクを表示させています。