railsのcontrollerで使用されるメソッドのまとめ

rails

railsのcontroller特有のメソッドについてまとめてみました。

railsのcontrollerで使用されるメソッド

require

外部ファイルやライブラリ、モジュールなど、別ファイルの関数を読み込むために使用される。

例えば、hoge_controller.rbが同じ階層にあるhoge2_controller.rbファイルを読み込みたい場合、下記のように読み込むことができる。

require ./hoge2_controller.rb

class HogeController < ApplicationController
end

より簡単に書く方法として、require_relativeがある。require_relativeを使用することでカレントディレクトリを示す./を省略することができる。

require_relative hoge2_controller.rb

class HogeController < ApplicationController
end

include

moduleを作成したときに、controllerに読み込ませるために使用される。

(例)hoge_controller.rbにhoge2_result.rbに書かれたmoduleを読み込ませるようにする。

module hoge2_result
  include do  #他のcontrollerで使用したいメソッドをinclude doで囲う
    def hoge_method
      ....
    end
  end
end
class HogeController < ApplicationController
 include Hoge2Result

  def index
    hoge_method #controller内で使用することができる。
  end
end

extend

extendを使うことで一部のメソッドではなくファイル全体をcontrollerに読み込ませることができる

(例)hoge_controller.rbにhoge2_result.rbに書かれたmoduleを読み込ませるようにする。

module Hoge2Result #ファイル名のキャメルケースにする
  extend ActiveSupport::Concern  #extendで"ActiveSupport::Concern"を指定する
  def hoge_method
    ....
  end
end

extend ActiveSupport::Concernする場合は、concerns配下にファイルを配置する必要がある。また、module名は、ファイル名のキャメルケースに合わせる必要がある。

読み込む側はincludeで上と同じ。

class HogeController < ApplicationController
 include HogeResult

  def index
    hoge_method #controller内で使用することができる。
  end
end

before_action

各actionを実行する前に行われる処理。一般的なのはdeviseを使用したbefore_action :authenticate_user!。ログインユーザーである場合はactionを実行することができる。(ログインしていない場合はエラーとなる)

class AdminController < ApplicationController
  before_action :authenticate_user!

  def index
  end

  def show
  end
end

下記のようにすることで、特定のアクションにのみbefore_actionを適用させることもできる。

class ArticlesController < ApplicationController
  # showアクションのみbefore_actionが適用される。
  before_action :authenticate_user!, only: [:show]

  def index
  end

  def show
  end
end

skip_after_action

devise_token_authのregistrationsControllerのコードにも書かれています。create、destroyアクション実行時にupdate_auth_headerの処理をスキップ(実施しない)しています。

module DeviseTokenAuth
  class RegistrationsController < DeviseTokenAuth::ApplicationController
    before_action :set_user_by_token, only: [:destroy, :update]
    before_action :validate_sign_up_params, only: :create
    before_action :validate_account_update_params, only: :update
    skip_after_action :update_auth_header, only: [:create, :destroy]

render

コントローラで作成したデータをレンダリング(viewファイルに表示する内容をわたす)する機能。

def update
  @book = Book.find(params[:id])
  if @book.update(book_params)
    redirect_to(@book)
  else
    render :edit, status: :unprocessable_entity
  end
end
# edit.html.erbテンプレートにstatus: :unprocessable_entityを渡す

フロントエンドがVueやReactの場合、json形式で渡すことでレンダリングすることができる。

render json: @book

# リレーションテーブルの関連づいたデータも渡す場合

render json: book.to_json(include: :author)
# bookテーブルに紐づいているauthorテーブルのデータもフロントエンドから参照できる。

mattr_reader

クラス変数を継承している子クラスで参照できる様にする。

// 親クラスで定義
mattr_reader :tests
@@tests = test #クラス変数

// 子クラス
put tests
# => testが表示

コメント

タイトルとURLをコピーしました