ActionViewとActionControllerでurl_forの挙動が違います

URLを出力するためにつかう「url_for」というメソッドがあります。
root_path, root_url, XXXX_path, XXXX_urlなどroutes.rbで定義したURLを呼び出すメソッドでも内部的に使っています。

このurl_forやXXXX_urlですが、Controllerの中で呼ぶときとViewの中で呼ぶときで挙動が違います。
Viewで呼ぶ時はURLがエスケープされたものが返ってくるのです。

Controllerでは

http://localhost:3000/controller/action?a=1&b=2

となるところがViewだと

http://localhost:3000/controller/action?a=1&b=2

となります。

普通にブラウザを相手にする場合は問題ないですが、
ActionMailerで送信するメールの文面の場合は不具合の素になるので注意が必要です。
url_forの引数に「:escape => false」を渡すとエスケープされずに返ってきます。