たろすの技術メモ

Jot Down the Tech

ソフトウェアエンジニアのメモ書き

ActionMailerのメソッドへ変数を渡す2つの方法

概要

ActionMailerのメソッドで変数を受け取る方法は2つあります。一つはHogeMailer.with(arg:).fugaの形式、もう一つはHogeMailer.fuga(arg)の形式です。どんな違いがあるのか調べてみました。

前提

両者の違い

HogeMailer.with(arg:).fugaの形式では「Mailerインスタンス全体で」参照でき、HogeMailer.fuga(arg)の形式では「呼び出したメソッド内でのみ」参照できるという違いがあります。

HogeMailer.with(arg:).fugaの形式

この形式では以下のようにメソッドを定義し、変数を受け取ります。

class HogeMailer < ApplicationMailer
  def fuga
    @arg = params[:arg]
    # do somethings..
  end
end

メソッド内でparams[:変数名]の形式でアクセスできます。また、fuga関数を呼び出した後に同じHogeMailerインスタンスで他のメソッドを呼び出してもparams[:変数名]の形式でアクセスできます。

【例】

# mailers/hoge_mailer.rb

class HogeMailer < ApplicationMailer
  def fuga
    @arg = params[:arg]
  end

  def piyo
    @arg = params[:arg]
  end
end
# controllers/hello_controller.rb

class HelloController < ApplicationController
  def index
    mailer = HogeMailer.with(arg: "arg")
    mailer.fuga.deliver_now
    mailer.piyo.deliver_now
  end
end

HogeMailer.fuga(arg)の形式

この形式では以下のようにメソッドを定義し、変数を受け取ります。

class HogeMailer < ApplicationMailer
  def fuga(arg)
    @arg = arg
    # do somethings..
  end
end

fugaメソッド内でのみアクセスできます。公開範囲を絞りたいときはこちらを使うと良いでしょう。