Railsでトレイリングスラッシュをつけるときに奮闘したメモです。
背景
- Google Search Console で 除外ページが多かった
- 「重複しています。Google により、ユーザーがマークしたページとは異なるページが正規ページとして選択されました」を解消したい
トレイリングスラッシュを強制
config/application.rb
に下記内容を追記
module Hoge
class Application < Rails::Application
・・・
# Add trailing slash
config.action_controller.default_url_options = { :trailing_slash => true }
end
end
上記設定だけだと、hoge_path
や hoge_url
メソッドを叩いた戻り値にトレイリングスラッシュがつくだけ
なので、直接URLにアクセスした場合は、トレイリングスラッシュがつかない
それだと、サチコのエラーは解消しないので、下記対応を実施
Herokuを使っている場合、サーバー側でリダイレクト処理をかけづらい
あまりよろしくないが、一時的なしのぎとして アプリケーション層でリダイレクト処理をかける
class ApplicationController < ActionController::Base
・・・
before_action :trailing_slash
・・・
private
# FIXME アプリケーション層で制御するのをやめたい
def trailing_slash
redirect_to "#{request.original_url}/", status: :moved_permanently unless request.original_url.match(/\/$/)
end
・・・
上記をするとRSpecでエラーになってしまう
というのも、テスト実行時にhoge_path
や hoge_url
メソッドを呼ぶのだが、そいつにトレイリングスラッシュがついていないから
なので、下記内容を config/environments/test.rb
に追記する必要がある
Rails.application.routes.default_url_options = { trailing_slash: true }