[rails]国際化対応でlocaleを省略したURLのrouting設定
タイトルだけだとよくわからないですね サンプルサイトとして、
/ # トップページ
/about # aboutページ
の2種類があるとします。
このサイトを国際化対応する際に通常は
/ja/ # 日本語版トップページ
/ja/about # 日本語版aboutページ
/en/ # 英語版トップページ
/en/about # 英語版aboutページ
といった/:locale/〜 形式のURLになると思いますが、
:localeが指定されていない場合はデフォルトの:localeを使うrouting設定にするにはどうすればいいかよく分からなかったので調べてみました。
デフォルトの:localeにjaが設定されている場合
/ # 日本語版トップページ
/about # 日本語版aboutページ
で各ページにアクセスできるようにしたかったのです。
- app/controllers/application_controller.rbを編集
:localeの指定があった場合は該当するlocale設定をするようにbefore_actionを定義します
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :set_locale
def default_url_options(options = {})
{ locale: I18n.locale }
end
def set_locale
I18n.locale = params[:locale] || I18n.default_locale
end
end
- config/routes.rbを編集
:localeでscopeを区切ります
この時、defaults設定に{ locale: "ja" }を設定することで:localeを省略できるようになります
Rails.application.routes.draw do
root 'pages#index'
scope "(:locale)", :locale => /ja|en/, defaults: { locale: "ja" } do
get '' => 'pages#index'
get 'about' => 'pages#about'
end
end