はじめに
Rails 6 に追加された新機能を試す第84段。 今回は、 parameterize
編です。
Rails 6 では、 parameterize
で locale
オプションを指定できるようになりました。
Ruby 2.6.4, Rails 6.0.0 で確認しました。
$ rails --version
Rails 6.0.0
今回は、name (名前) 属性をもつUser の CRUD を作成し、 URL を parameterize を使って変更することで動作確認します。
プロジェクトを作る
rails new rails_sandbox
cd rails_sandbox
User の CRUD を作る
name の属性をもつ User のCRUDを作ります。
bin/rails g scaffold User name
Userモデルに to_param メソッドを追加する
User モデルで、 to_param メソッドを追加します。このメソッド内で locale
オプションつきの parameterize
メソッドを使います。
class User < ApplicationRecord
def to_param
"#{id}-#{name.parameterize(locale: :de)}"
end
end
config/application.rb を修正する
ドイツ語環境を整えるのが面倒なので、 I18n::InvalidLocale
を避けるために、 config/application.rb
を編集します。
...
I18n.enforce_available_locales = false
ドイツ語用のロケールファイルを作成する
ドイツ語の変換ルールの locale ファイルを用意します。
de:
i18n:
transliterate:
rule:
Ä: AE
ä: ae
Ö: OE
ö: oe
Ü: UE
ü: ue
ß: SS
マイグレーションを実行する
$ bin/rails db:create db:migrate
画面からユーザーを登録する
bin/rails s
を実行し、 http://localhost:3000/users/new にアクセスしてユーザーを登録します。
name には、 Jürgen
と入力します。 [Create User] ボタンを押します。
詳細画面のURLは、 http://localhost:3000/users/1-juergen
と変換されていることがわかります。
(Jürgen
→ juergen
と変換される。)
locale を指定しなかった場合
今回の場合、 locale オプションを指定しなかった場合
つまり、
class User < ApplicationRecord
def to_param
"#{id}-#{name.parameterize}"
end
end
とした場合、URLは、 locale オプションは、nil になり、 I18n.locale
が使われます。
今回は、 I18n.locale
をデフォルトから変更していないため、 I18n.locale
は en
になるため、 URLは、 http://localhost:3000/users/1-jurgen
となります。
(Jürgen
→ jurgen
と変換される。)
試したソース
試したソースは以下にあります。
https://github.com/suketa/rails_sandbox/tree/try084_parameterize_locale