give IT a try

プログラミング、リモートワーク、田舎暮らし、音楽、etc.

RailsのActionMailerでハマったところ

RailsによるアジャイルWebアプリケーション開発 第4版

RailsによるアジャイルWebアプリケーション開発 第4版

  • 作者: Sam Ruby,Dave Thomas,David Heinemeier Hansson,前田修吾
  • 出版社/メーカー: オーム社
  • 発売日: 2011/12/01
  • メディア: 単行本(ソフトカバー)
  • 購入: 12人 クリック: 206回
  • この商品を含むブログ (40件) を見る

第4版Rails本を見ながら、メール送信プログラムを作ってました。
第13章に書いてあるサンプルコードを見て問題なく動くコードを書いたはずなのに、メールが届かない・・・。
ログを見ても特にエラーは出ていない・・・。


僕はconfig/application.rbに設定を記述してたんですが、config/environments/development.rbを見ると、

config.action_mailer.raise_delivery_errors = false

と書いてあるのを見つけて「エラーが出ない原因はコレかー!」と速攻でコメントアウトしてみましたが、状況は変わらず・・・orz


本を読みなおしたり、ネットを検索したり、あれこれ小一時間ほど悩んでいましたが、実はしょうもないミス、というか知識不足が原因でした。


ずっと、Railsのコンソール上で

MyMailer.send

みたいなメソッドを実行していたのですが、Rails本をよく見ると

OrderNotifier.received(@order).deliver

と書いてありました。
ん?「deliver」??


正解は

MyMailer.send.deliver

というふうにMailerのメソッドに続けて、「deliver」メソッドを呼ぶ必要があったのでした。


え〜?だってMailerのコードってこんな感じですよ?

class MyMailer < ActionMailer::Base
  def send
    mail to: "hoge@piyo.com", subject: "test"
  end
end

いかにもこれでメールが送信されそうじゃないですか??
そうじゃない?そうですか。ごめんなさい。。。


P.S.
JavaとかC#だったら、オブジェクトが返されるっていうのがシグニチャから分かりますよね?

// C#ならたぶんこんな感じ。
class MyMailer : ActionMailer 
{
  public MailObject Send()
  {
    // メールは送信せずにオブジェクトを返すだけ、と推測しやすい
    // (そしてSendというメソッド名がよろしくないことも分かる)
    return this.mail("hoge@piyo.com", "test");
  }
}

でもRubyだと、そこでアクションが実行されるのかされないのかがちょっと分かりにくいな〜・・・と「return xxx」で書く言語に慣れきっちゃってる僕はそんな風に思いました。
いや、これでRubyがキライになったわけじゃないですけどね。