5

私が理解していること

次のような便利な検証を備えたクラスがあるとします。

User < ActiveRecord::Base
    validates :username, :format => {/regex/}, :message => :name_format
end

この場合、i18nmy に以下を含めることで、エラー メッセージを翻訳可能にするために使用できます/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 が文字列を検索するときにUserSubclassOnetoの階層を検索し、「ヒット」したときに気付くことを願っていますが、(私が何かひどく間違ったことをしていない限り) どうやらそれは起こらないようです。Useren.yml

en.yml.en.errors.models明らかな解決策は、 for useruser_subclass_one、などでデータを複製することですuser_subclass_twoが、私の Rails 感覚では、これは非常に間違っていることがわかります。

アイデアはありますか?

合併症の可能性:

User、...、を定義する完全な Rails アプリに含まれるMyGemRails エンジンに含まれるgemで定義されます。ただし、検証はファイルが存在する場所で実行されているため、これは問題ではないと思います-場合に備えて人々に知らせたかっただけです.MyEngineMyAppUserSubclassOneUserSubclassEnnMyGem::Useren.yml

最終的な問題/解決策:

したがって、問題は名前空間であることがわかりました。MyApp( を定義するUserSubclassOne) がMyGem( を定義する) を使用することを思い出してくださいUserUser実際には名前空間にあることが判明したためMyGem(これは必ずしもそうであるとは限りません)、先頭の完全な宣言行は次のようにUserはなりません。

User < ActiveRecord::Base

むしろ

MyGem::User < ActiveRecord::Base

.

i18n gem がクラス階層を検索すると、この名前空間に気付き、単に、、などmy_gem/userではなく、を検索します。usermy_gem.usermy_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!'

そしてビンゴ!

4

2 に答える 2

6

したがって、問題は名前空間であることがわかりました。MyApp( を定義するUserSubclassOne) がMyGem( を定義する) を使用することを思い出してくださいUserUser実際には名前空間にあることが判明したMyGemため (常にそうとは限りません)、先頭の完全な宣言行は次のようにUserはなりません。

User < ActiveRecord::Base

むしろ

MyGem::User < ActiveRecord::Base

.

i18n gem がクラス階層を検索すると、この名前空間に気付き、単に、、などmy_gem/userではなく、を検索します。usermy_gem.usermy_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!'

そしてビンゴ!

于 2013-02-21T19:17:06.723 に答える
2

Active Record検証エラーメッセージのエラーメッセージスコープ(5.1.1)に関するi18nのRailsガイドによると、あなたがしようとしていることがうまくいくはずです:

次のような name 属性の検証を持つ User モデルを考えてみましょう。

class User < ActiveRecord::Base
  validates :name, :presence => true
end

<...中略...>

モデルがさらに継承を使用している場合、メッセージは継承チェーンで検索されます。

たとえば、User から継承する Admin モデルがあるとします。

class Admin < User
  validates :name, :presence => true
end

次に、Active Record は次の順序でメッセージを探します。

activerecord.errors.models.admin.attributes.name.blank
activerecord.errors.models.admin.blank
activerecord.errors.models.user.attributes.name.blank
activerecord.errors.models.user.blank
activerecord.errors.messages.blank
errors.attributes.name.blank
errors.messages.blank

このようにして、モデル継承チェーンのさまざまなポイント、および属性、モデル、またはデフォルト スコープで、さまざまなエラー メッセージに特別な翻訳を提供できます。

したがって、あなたの場合、クラスが次のようになっていると仮定します。

アプリ/モデル/user.rb

User < ActiveRecord::Base
  validates :username, :format => {/regex/}, :message => :name_format
end

アプリ/モデル/user_subclass.rb

UserSubclass < User
  validates :username, :format => {/regex/}, :message => :name_format
end

config/locales/en.ymlは次のようになります。

en:
  activerecord:
    errors:
      models:
        user:
          attributes:
            username:
              name_format: 'has the way-wrong format, bro!'

次に、検証を検索するメッセージが表示されますUserSubClass

activerecord.errors.models.user_sublcass.attributes.username.name_format # fail
activerecord.errors.models.user_sublcass.name_format                     # fail
activerecord.errors.models.user.attributes.username.name_format          # success
activerecord.errors.models.user.name_format
# ...

モデル ファイルと yaml ファイルが上記のように見えると仮定すると、あなたが言及した潜在的な複雑さが問題になる可能性がありますが、明らかに確信は持てません。

于 2013-02-15T04:05:50.917 に答える