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がキライになったわけじゃないですけどね。