私が理解していること
次のような便利な検証を備えたクラスがあるとします。
User < ActiveRecord::Base
validates :username, :format => {/regex/}, :message => :name_format
end
この場合、i18n
my に以下を含めることで、エラー メッセージを翻訳可能にするために使用できます/config/locals/en.yml
。
en:
activerecord:
errors:
models:
user:
attributes:
username:
name_format: 'has the way-wrong format, bro!'
これは問題なく、一般的に非常に便利です。
私が知りたいこと:
私の質問は: User から継承するサブクラスがあるとどうなるか:
UserSubclassOne < User
# extra stuff
end
UserSubclassTwo < User
# extra stuff
end
...
UserSubclassEnn < User
# extra stuff
end
ここでの問題は、Rails が翻訳を見つけられないことuser_subclass_one.attributes.username.name_format
です。
それは不平を言う:
translation missing:
en.activerecord.errors.models.user_subclass_one.attributes.username.name_format
Rails が文字列を検索するときにUserSubclassOne
toの階層を検索し、「ヒット」したときに気付くことを願っていますが、(私が何かひどく間違ったことをしていない限り) どうやらそれは起こらないようです。User
en.yml
en.yml.en.errors.models
明らかな解決策は、 for user
、user_subclass_one
、などでデータを複製することですuser_subclass_two
が、私の Rails 感覚では、これは非常に間違っていることがわかります。
アイデアはありますか?
合併症の可能性:
User
、...、を定義する完全な Rails アプリに含まれるMyGem
Rails エンジンに含まれるgemで定義されます。ただし、検証はファイルが存在する場所で実行されているため、これは問題ではないと思います-場合に備えて人々に知らせたかっただけです.MyEngine
MyApp
UserSubclassOne
UserSubclassEnn
MyGem::User
en.yml
最終的な問題/解決策:
したがって、問題は名前空間であることがわかりました。MyApp
( を定義するUserSubclassOne
) がMyGem
( を定義する) を使用することを思い出してくださいUser
。User
実際には名前空間にあることが判明したためMyGem
(これは必ずしもそうであるとは限りません)、先頭の完全な宣言行は次のようにUser
はなりません。
User < ActiveRecord::Base
むしろ
MyGem::User < ActiveRecord::Base
.
i18n gem がクラス階層を検索すると、この名前空間に気付き、単に、、などmy_gem/user
ではなく、を検索します。user
my_gem.user
my_gem: user
en.yml
したがって、ファイルを次
のように変更する必要がありました: /config/locals/en.yml
:
en:
activerecord:
errors:
models:
my_gem/user:
attributes:
username:
name_format: 'has the way-wrong format, bro!'
そしてビンゴ!