Twitter以上ブログ以下

ただの読み物

Rspec,RailsのRequestSpecにおいて、post時にrefererをセットするには _path じゃなくて _url を使う

背景

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.referrernil になってしまっていた。ただ、 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。