1

I18nはutf-8形式のymlから読み取り、translateはutf-8からutf-8に変換します。ActiveModel :: Errorsでのエンコードの問題

私のレガシーコードがActiveModelに大きく依存している:: Errors.full_messages、

例えば、

ビューで
# note: the message is not utf-8 encoding 
validates_length_of :title,:maximum => 2,:message => 'abc'.encode("shift_jis") 

を、それが使用しています:

item.errors.full_messages.each do |msg| 
end 

をエラーのようなものになります。

I18n.t(:title) + " " + 'abc' 

は、実際には、full_message関数で、実際のソースコードがあるようなもの:

def full_message(attribute, message) 
    return message if attribute == :base 
    attr_name = attribute.to_s.tr('.', '_').humanize 
    attr_name = @base.class.human_attribute_name(attribute, default: attr_name) 
    I18n.t(:"errors.format", { 
    default: "%{attribute} %{message}", 
    attribute: attr_name, 
    message: message 
    }) 
end 

問題は、次のようになる:%{属性}はUTF-8であり、%{メッセージ}はUTF-8ではありません、 full_messageを呼び出すときにエラーが発生します。

あり私は考えることができるいくつかのソリューションです:

1)UTF-8にエラーメッセージを変更するには(非UTF-8である他の文字列がたくさんある)ので、私が対処しなければなりませんutf-8と非utf-8の組み合わせをソースコード内のどこにでも持ち、一緒になると適切な変換を行います。

2)(full_messagesに似た)エラーメッセージを列挙する方法を見つけますが、実装は異なります。 ActiveModel :: errorsのAPIを調べようとしましたが、エラーを列挙できるように内部APIが見つかりませんでした。

3)I18n.tのデフォルト動作を変更して、utf-8以外を返します。

4)ActiveModel :: Errors.full_messagesを変更して、utf-8以外を返します。

実際には2番目のオプションが最適ですが、エラーメッセージをfull_messagesと同じ方法で列挙する方法がわかりません。エラーの内部データ構造を返すパブリックAPIを見つけることができませんでしたか?

最後の2つのオプションは、可能かどうかわからないrubyライブラリへの注入が必要です。

いくつかのヒントを教えてください。ありがとう。

答えて

1

ルビー(とレール)のほとんどすべての動作を変更できます。

はちょうどこのような何かを設定/初期化子内に新しい初期化子ファイルを作成します。

#monkeypatch_i18n.rb 
(i don't know the exact path of active_model/errors.full_messages) 
module ActiveModel 
    module Errors 
    def full_messages 
     #new logic 
    end 
    end 
end 

は、これがデフォルトのメソッドをオーバーライドします。

については、 juanmaです。

編集: もっときれいな解決策が考えられます。

#lib/monkey_patch_i18n.rb 
module ActiveModel 
     module Errors 
     def full_messages 
      #new logic 
     end 
     end 
    end 

#config/initializers/init_i18n.rb 
require "#{Rails.root}/lib/monkey_patch_i18n.rb" 
関連する問題