背景
Rspec で、ある条件のリクエストをすると、refererがあった場合にはreferer、そうでない場合は default みたいな感じの飛ばし方をしようとしているところがあって、これのSpecを書こうとしていた。
結論
request.referer
で参照させるには、 /awsome
だけではだめで、 http://localhost/awesome
とフルパスが必要。
概要
# in application_controller.rb def back_or_home_path request.referrer || home_path end # in awesome_controller.rb def create if params[:hoge].blank? redirect_to back_or_home_path end # ... end
こんな感じ。本当はもちっと複雑。これをテストするのに
post awsome_path, params, {'HTTP_REFERER' => super_awsome_path} expect(response).to redirect_to(super_awsome_path)
と書いていた。
これでは request.referrer
は nil
になってしまっていた。ただ、 HTTP_REFERER
はセットされていて、この値が nil 。
実体としても多分だめで、実装としても多分ダメで、
- post awsome_path, params, {'HTTP_REFERER' => super_awsome_path} + post awsome_path, params, {'HTTP_REFERER' => super_awsome_url}
これで、 request.referrer
が文字列で ‘http://local….’ になって、一件落着。
ActionPack、Rackとかにも潜ったけど、なんでこれで通るのか、すぐにはわからなかった。 本格的に潜るのも時間もったいないので、そういうもんなのかーみたいな気持ちでDump。