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へのリンクを表示させています。