👏

[Rails] コンバージョン元のページを取得する方法

2024/08/21に公開

何の記事

開発業務にて、とあるコンバージョンがどのページから来て発生しているのか特定するためにRailsで実装することになったのですが、RefererかURLパラメータなのかのどちらで実装するか悩んだので、調査してみた記事です。

概要

Webアプリケーション開発において、ユーザーがどのページからコンバージョンが発生したのかを特定することは非常に重要な業務の一つです。

Railsを使用してこの機能を実装する方法を解説します。

2つの実装方法、「Referer」と「URLパラメータ」について、それぞれのメリットを紹介し、最終的には、2つを組み合わせた方法を推奨として紹介します。

実装方法とそれぞれのメリット・デメリット

1. Refererを使用する方法

メリット:

  • 実装が非常に簡単(1行のコードで取得可能)
  • ユーザーの行動を確実に追跡できる

デメリット:

  • ブラウザの設定やプライバシー設定によってはRefererが取得できない
  • HTTPS → HTTP の遷移ではRefererが送信されない
  • 外部サイトからの遷移では、取得が制限される

2. URLパラメータを使用する方法

メリット:

  • 確実にデータを取得できる
  • 開発者が期待する通りの情報を取得可能
  • カスタマイズが容易(任意の情報を付加できる)

デメリット:

  • URLにパラメータを追加する実装が必要
  • ユーザーが直接URLを入力して遷移した場合、遷移元が取得できない
  • 新しい遷移元ページが追加された場合、対応漏れの可能性がある

3. RefererとURLパラメータを併用する方法(推奨)

メリット:

  • 両方の長所を活かせる(確実性と柔軟性の両立)
  • 様々なケースに対応可能

デメリット:

  • 実装がやや複雑になる

コード例

1. Refererを使用する方法

  • このコントローラーはRefererを使用してコンバージョンの遷移元を追跡します。
  • Refererはブラウザが自動的に送信する情報を利用するため、実装が簡単です。
  • ただし、一部の環境では取得できない場合があることに注意してください。

# app/controllers/conversions_controller.rb
class ConversionsController < ApplicationController
  def create
    # リファラー(遷移元ページのURL)を取得
    referrer = request.referer

    # コンバージョンの作成と保存
    @conversion = Conversion.new(
      user: current_user,
      source: referrer,
      conversion_type: params[:type]
    )

    if @conversion.save
      # 成功時の処理
      flash[:success] = "コンバージョンを記録しました"
      redirect_to thank_you_path
    else
      # 失敗時の処理
      flash[:error] = "コンバージョンの記録に失敗しました"
      redirect_back fallback_location: root_path
    end
  end
end

2. URLパラメータを使用する方法

  • このコードはURLパラメータを使用してコンバージョンの遷移元を追跡します。
  • URLパラメータ方式は確実にデータを取得でき、カスタマイズも容易です。
  • ただし、全てのリンクにパラメータを追加する必要があります。
# app/controllers/conversions_controller.rb
class ConversionsController < ApplicationController
  def create
    # URLパラメータから遷移元を取得
    source = params[:source]

    # コンバージョンの作成と保存
    @conversion = Conversion.new(
      user: current_user,
      source: source,
      conversion_type: params[:type]
    )

    if @conversion.save
      # 成功時の処理
      flash[:success] = "コンバージョンを記録しました"
      redirect_to thank_you_path
    else
      # 失敗時の処理
      flash[:error] = "コンバージョンの記録に失敗しました"
      redirect_back fallback_location: root_path
    end
  end
end

# app/helpers/application_helper.rb
module ApplicationHelper
  # ソース情報付きのリンクを生成するヘルパーメソッド
  def link_with_source(text, url, source, options = {})
    uri = URI.parse(url)
    params = URI.decode_www_form(uri.query || '').to_h
    params['source'] = source.sub(%r{^/}, '')
    uri.query = URI.encode_www_form(params)

    link_to(text, uri.to_s, options)
  end
end

# 遷移元のページ(例:app/views/products/index.html.erb)
<%= link_with_source '購入する', new_conversion_path(type: 'purchase'), 'products_index', class: 'btn btn-primary' %>

3. RefererとURLパラメータを併用する方法(推奨)

  • このコードはRefererとURLパラメータの両方を使用して、コンバージョンの遷移元を追跡します。
  • この方法は両者の利点を活かし、より確実にデータを取得できます。
# app/controllers/application_controller.rb
class ApplicationController < ActionController::Base
  before_action :set_source

  private

  def set_source
    @source = params[:source] || extract_source_from_referer
  end

  def extract_source_from_referer
    referer = request.referer
    return nil unless referer

    uri = URI(referer)
    if uri.host == request.host
      "#{uri.path.gsub('/', '_')}"
    else
      "external_#{uri.host}"
    end
  rescue URI::InvalidURIError
    nil
  end
end

# app/controllers/conversions_controller.rb
class ConversionsController < ApplicationController
  def create
    @conversion = Conversion.new(
      user: current_user,
      source: @source,
      conversion_type: params[:type]
    )

    if @conversion.save
      Analytics.track(@conversion) # 分析サービスへの送信(仮想のメソッド)
      flash[:success] = "コンバージョンを記録しました"
      redirect_to thank_you_path
    else
      flash[:error] = "コンバージョンの記録に失敗しました"
      redirect_back fallback_location: root_path
    end
  end
end

# app/models/conversion.rb
class Conversion < ApplicationRecord
  belongs_to :user
  validates :source, presence: true
  validates :conversion_type, presence: true

  # コンバージョンタイプの定義
  TYPES = %w[purchase signup newsletter].freeze
  validates :conversion_type, inclusion: { in: TYPES }

  # ソース別のコンバージョン数を集計
  def self.count_by_source
    group(:source).count
  end
end

まとめ

Railsでコンバージョン元ページを特定する最適な方法は、3つ目のRefererとURLパラメータを併用する方法です。

この方法により、様々なケースに対応しつつ、確実にユーザーの行動を追跡できます。

Discussion