3

エラーメッセージ自体ではなく、検証エラーの翻訳キーをデータベースに保存したくない状況があります。次の状況を想像してください。

class Car < ActiveRecord::Base
  validates_presence_of :year, :fuel
end

car = Car.new(:fuel => 'Diesel')
car.save!
#=> ActiveRecord::RecordInvalid

今私が電話した場合:

car.errors
#=> :year=>["can't be blank"]

翻訳されたエラー メッセージが表示されます。

代わりに、これを生成する翻訳キーを抽出したいと思います (この場合は、のようなものになると思いますerrors.messages.blank)。別のモデルでデータベースに保存できるようにします。たとえばFailedCar、後で I18n カスタマイズされたフォームを生成できます。ビューで不足している情報を手動で入力します。

アップデート

私がフックする必要があるのはこの方法だと思います。キーと返されたオプションをフェッチして、後で翻訳を再度実行できるようにします。

4

2 に答える 2

9

よし!やっと手に入れた!

解決策は、パッチを当てたり、レール側で何かをしたりしないことです。代わりに、答えはI18ngemにあります。

Rails が標準で変換に使用する I18n には、新しいバックエンドをプラグインして柔軟性を高める機能があります。この場合、メタデータと呼ばれるバックエンドがまさに私が必要としていたことを行います。初期化子に追加I18n::Backend::Simple.include(I18n::Backend::Metadata)すると、メソッド call を追加することで、エラー メッセージ文字列からすべての翻訳関連情報を直接抽出できるようになりますtranslation_metadata

複雑な問題に対する素晴らしいシンプルな解決策:-)

于 2013-07-16T11:25:07.803 に答える