6時だョ!!全員集合!!

Rails・JavaScrictを中心にアウトプットします。

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

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

Rails localeの使い方

日時の使い方

コンソールで確認してみる

[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の違い

class Time リファレンスマニュアル

UTCとは

協定世界時タイムゾーンを意味している。

協定世界時 (UTC)(英:Coordinated Universal Time)とは UTCは今の世界で標準時として使っている時間。 日本時間から9時間引いている。

UTCは、セシウム原子の振動数をもとに導き出す時間らしい。

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]と出力される

Railsのログを理解する-ログの基礎知識-

||= とは?

@task_logger ||= Logger.new('log/task.log', 'daily')
# 左辺が空の場合、右辺を左辺に代入

loggerとは

loggerはログを出力するために、Railsにあらかじめ用意されている機能です。

また、loggerの機能はActiveSupportクラスを継承したLoggerクラスによって構成されています。

loggerを使えば、簡単にログを出力できます。

なので、バグの原因を探すときなどに便利です。

使い所のイメージを持っておく事。(不正にアクセスしようとしたユーザーを警告等を付けログを見る事で可視化し対策できるかも?) 実際に必要になるようなケースが起きたときに引き出しの知識として持っておく。

今日やったこと

  • i18n
  • 日時の取り扱い、Railsでの時刻の取り扱いはTimeWithZoneクラス!
  • エラーハンドリング、開発環境でも本番用のエラーページ見たい!
  • ログの重要性、実際にいつ使うの? 

参照

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

RubyRailsにおける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