【Rails】request.refererとは?

コントローラーでリダイレクトさせる際にrequest.referer という見慣れない記述を見かけたので調べてみました。

結論

request.referer で遷移元のURLを取得できる。

requestとは?

現在実行中のリクエストサイクルの中でリクエスト情報が保存されているrequestオブジェクトを表示するメソッド。 レスポンス情報が保存されているresponseオブジェクトを表示するresponse メソッドも用意されている。

Action Controller の概要 - Railsガイド

refererとは?

リクエスト情報の中の遷移元の情報を表示するRailsに用意されているメソッド。 request.env の中のHTTP_REFERER に遷移前の情報が保存されているようです。 referer メソッドは内部的にこのrequest.env['HTTP_REFERER'] を参照しています。

[Rails]遷移元のURLを表示する方法 | COTeggのバケツ

referer (Rack::Request) - APIdock

responseを使ってレスポンス情報を表示してみる

コントローラー内の適当なアクションにbinding.irb をセットし、遷移時のレスポンス情報を表示してみます。

# users_controller.rb

class UsersController < ApplicationController
  def show
    binding.irb # 処理を止めてshowアクション時のレスポンス情報を見てみる
    @user = User.find(params[:id])
    # 何かしらの処理
  end
end

requestrequest.refererrequest.env['HTTP_REFERER'] のそれぞれの出力結果です。

> request
=> #<ActionDispatch::Request GET "http://localhost:3000/users/8" for ::1>
> request.referer
=> "http://localhost:3000/users/8"
> request.env['HTTP_REFERER']
=> "http://localhost:3000/users/8"

前述したようにrequest.refererrequest.env['HTTP_REFERER'] の出力は同じ値になっています。

便利な使い方

コントローラーでリダイレクトさせる際に遷移元のURLを取得し、遷移させることができる。

[Rails]遷移元のURLを取得してリダイレクトする方法 - Qiita

# 何かしらのcontroller

def method
  # 何かしらの処理
  redirect_to request.referer # 遷移元のURLにリダイレクトする
end

まとめ

request.referer は今後使い道がありあそうなので知っておいて良かった。

参照

Action Controller の概要 - Railsガイド

[Rails]遷移元のURLを表示する方法 | COTeggのバケツ

referer (Rack::Request) - APIdock

[Rails]遷移元のURLを取得してリダイレクトする方法 - Qiita