私の歴史と今

振り返ると恥ずかしくなるのが私の歴史。だけどそのときは真面目に書いていた訳でね。そんな今の私を書いていく。

ActiveMode::Modelのi18nの書き方

Rails4アプリを作成してまず試してみたのがActiveModel::Modelを使ったフォームのバリデーション。
Strutsで育った身としては、ActiveRecordで入力チェックするのは違和感があり、ビジネスロジックに入る前にコントローラでチェックしたい。そんな理由からActiveModel::Modelをフォーム代わりに使用した。

そこでわからなかったのがconfig/locales/ja.ymlの書き方。以下のようなクラスを作った場合、ja.ymlはどう書けばいいんだ?

class Front::LoginForm
  include ActiveModel::Model
  attr_accessor :login_id, :passwd
end

ja.activerecord.modelsに書けばいいと思っていたのだけど違ってた。以下のように書くみたい。

ja:
  activemodel:
    models:
      front/login_form: "ログイン"
    attributes:
      front/login_form:
        login_id: ログインID
        passwd: パスワード

調べてみると、ActiveModel::ModelはRails4で作られたようだけど、ActiveModelはRails3の時から存在していて既に上記のように書けたみたいね。

ちなみに、今回作ったクラスはFrontモジュール内に作ったので、それをどう表現すればいいのか迷いました。

ja:
  activemodel:
    models:
      front/login_form: "ログイン"

なのか

ja:
  activemodel:
    models:
      front:
        login_form: "ログイン"

なのか。結局前者だった訳だけど、その辺のヒントはmodel_namクラスメソッドにありました。

irb(main):026:0> y Front::LoginForm.model_name
--- !ruby/object:ActiveModel::Name
name: Front::LoginForm
klass: !ruby/class 'Front::LoginForm'
singular: front_login_form
plural: front_login_forms
element: login_form
human: Login form
collection: front/login_forms
param_key: front_login_form
i18n_key: :front/login_form
route_key: front_login_forms
singular_route_key: front_login_form
=> nil
irb(main):028:0> Front::LoginForm.model_name.i18n_key
=> :"front/login_form"

Rubyの開発をしていていつも思うのは「無知って怖い」っていうこと。RailsでWEBアプリを作ることができるけど、Railsの調べ方が難しい。中途半端にググってもバージョンにマッチした情報が出てこなかったりする。そもそも機能の存在自体を知らない場合はググることすらしない。多分、最短距離は「チュートリアルを読むこと」だとは思うが。