ActionMailerで送るメールにURLを付加したいとき

  • ActionMailerではurl_forが使える
    • ただし、:only_path => falseにしたかったら以下どちらかを選ぶ必要がある
      • url_forに:hostをつける or default_url_options[:host]を設定する
        • こっちだと固定の値を持ってしまうのでちょっと・・・
      • コントローラーを受け取って、コントローラーのurl_forを使う
        • 今回は、application.rbのbefore_filterで Thread.current[:controller]に詰め込んで、mailerのビューで取得
  • RSpecでurl_forメソッドがちゃんと呼ばれたかどうかのチェック
    • should_receiveに対して、withをつける。withの意味は、その引数が来た状態でメソッドが呼ばれたかどうか

@obj = Object.new
==Thread.stub!(:current).and_return({ :controller => @obj})==
@obj.should_receive(:url_for).with(:controller => :apply, :action => :profile, :id => @project.id, :only_path => false)

※↑の解説
Thread.currentを呼ぶと、@objが返される
@objのurl_forメソッドが、with以下の引き数で呼ばれるたことを確認する

    • -

追記。
Thread.stub!は危険!
テスト実施中にテストケースごとのデータのクリアが動かなくなる事件が発生
なので、Mailerのクラスにurl_forを呼ぶためのメソッドを追加し、
それをスタブするように変えた