2021年8月20日 現場Rails Chapter6-3 i18n国際化
国際化とは何か
国際化とは、さまざまな国ごとに最適な表示を行えるように基盤を整える事である。 ↓ ざっくり言うと、国によって自動でサイト内の言語を変えるように基盤を整える事である。
日本語を扱う方法
config.i18n.default_locale = :jaを設定(config/initializersの配下にymlを配置)
エラーメッセージの日本語データの書かれたja.ymlを入手す る ja.ymlにモデルのクラスや属性に対応する日本語を記述する
スレッドセーフとは
スレッドセーフとは、マルチスレッド環境において、あるコンピュータプログラムを複数のスレッドで並行して実行しても、問題が生じない仕様や設計になっていること。
ぼっち演算子 &.
&.という演算子を使ってメソッドを呼び出すと、レシーバがnilであった場合でもエラーが発生しなくなる。 現場Rails P47
ymlファイル
ヤムルファイルと読む。
conifg/initializers/locale.rbに、デフォルトの言語や、アプリケーションで有効とする言語を設定する。 config/localesディレクトリに、ローケールファイル(ja.ymlとかen.yml)を配置する。
I18n.locale
current_user.locale # => nilにメソッドは不可なので例外発生 current_user&.local # => ぼっち演算子でnilのケースでも回避 current_user&.local || :ja # => current_userがnilだったら、右側(:ja)を返す。左がnil or false 以外だったら、左が先に返る。
p answer = 'Hello' || nil #=> "Hello" p answer = nil || 'こんにちは' # => "こんにちは" p answer = 'yahho' || 'こんにちは' #=> "yahho"
humanメソッドとhuman_attribute_nameメソッド
humanメソッドとhuman_attribute_nameメソッドで、モデル名やモデルの属性名を取得できる。
参照 Qiita
日時の使い方
コンソールで確認してみる
[1] pry(main)> Time.zone => #<ActiveSupport::TimeZone:0x00007fb695c58480 @name="Tokyo", @tzinfo=#<TZInfo::DataTimezone: Asia/Tokyo>, @utc_offset=nil> [2] pry(main)> Time.zone.now => Fri, 20 Aug 2021 07:48:56 JST +09:00 [3] pry(main)> Time.zone.now.class => ActiveSupport::TimeWithZone [4] pry(main)>
config.time_zone= 'Asia/Tokyo' # タイムゾーンをデフォルトのUTCから日本時間に変換。DBに保存される日時とは異なる。現場Rails 244ページの図6-4-1の②の部分。
config.active_record.default_timezone = :local # DB内の時間設定を:localに合わせる。デフォルトはutc。現場Rails 244ページの図6-4-1の①の部分。
in_time_zone
引数(エリア)にタイムゾーンを変更できる。 Apidock in_time_zone
Time.zone = 'Hawaii' # => 'Hawaii' DateTime.new(2000).in_time_zone # => Fri, 31 Dec 1999 14:00:00 HST -10:00 DateTime.new(2000).in_time_zone('Alaska') # => Fri, 31 Dec 1999 15:00:00 AKST -09:00
Railsで使われているcreated_atはTimeWithZoneクラスである
参照
RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い
UTCとは
協定世界時 (UTC)(英:Coordinated Universal Time)とは UTCは今の世界で標準時として使っている時間。 日本時間から9時間引いている。
config.consider_all_requests_local
config.consider_all_requests_localをtrueにすると、デバッグ用のエラー画面(現場Rails p246の画像)が出る。 config.consider_all_requests_localをfalseにすると、本番用のエラー画面(現場Rails p247の画像)が出る。
エラー処理のカスタマイズ
本番環境のconfig.consider_all_requests_local
はtrueにしない!!
=> 誰かにコードが見られてしまう可能性があるため。
デバッグ用のエラー画面だと、画面下部にコンソールがある。そのコンソールを使って、どのようなコードがあるか見られてしまう。
ログとは?
ログとは、コンピュータの世界における、やったことや起こったことの「記録」である。
ログのいいところ
ログのいいところは、特定の日時にどんなことをしてるか記録する事である。
ex) - アドミンユーザーじゃないユーザーが、アドミン権限が必要なリソースにアクセスするときに警告を記録する。 - ゲームの不正ユーザの行動を記録できる。
Railsのログ
ログレベル
- 5:unknown;原因不明のエラー
- 4:fatal:エラーハンドリング不可能な致命的エラー
- 3:error:エラーハンドリング可能なエラー
- 2:warn:警告
- 1:info:通知
- 0:debug:開発者向けデバッグ用詳細情報
特定のパラメータをマスクする
# config/initializers/filter_parameter_logging.rb Rails.application.config.filter_parameters += [:password] # ログ上では password の部分は [FILTERED]と出力される
@task_logger ||= Logger.new('log/task.log', 'daily') # 左辺が空の場合、右辺を左辺に代入
loggerとは
loggerはログを出力するために、Railsにあらかじめ用意されている機能です。
また、loggerの機能はActiveSupportクラスを継承したLoggerクラスによって構成されています。
loggerを使えば、簡単にログを出力できます。
なので、バグの原因を探すときなどに便利です。
使い所のイメージを持っておく事。(不正にアクセスしようとしたユーザーを警告等を付けログを見る事で可視化し対策できるかも?) 実際に必要になるようなケースが起きたときに引き出しの知識として持っておく。
今日やったこと
参照
DateTimeクラスは非推奨 https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
Timeクラスとは https://docs.ruby-lang.org/ja/latest/class/Time.html
Rails】localeの使い方 https://qiita.com/d0ne1s/items/89846ebe97c9114865ca
||演算子のいろんな使い方 https://qiita.com/ngron/items/4d3ca9827d1969fccd60
RubyとRailsにおけるTime, Date, DateTime, TimeWithZoneの違い https://qiita.com/jnchito/items/cae89ee43c30f5d6fa2c
Railsのログを理解する-ログの基礎知識- https://qiita.com/sobameshi0901/items/b963e7046e2ae8b8e813
||= とは? https://qiita.com/yoshi1729/items/be6ecc60b3e7a0a2ca72
現場Rails特典 https://book.mynavi.jp/files/user/support/9784839962227/genba_Rails_2ndkinen.pdf