2

バックグラウンドで処理される Web サーバー (Rails) にユーザーがデータを送信する状況があります。

POST /fibonacci/6012 HTTP/1.1
Host: example.com

サーバーは、ユーザーがステータスを確認するために使用できるバックグラウンド ジョブへのリンクで応答します。

HTTP/1.1 202 Accepted
Location: http://example.com/jobs/5699121

注意すべき重要なことは、すべての(承認された) ユーザーがジョブのステータスを確認できることです。これは、エラー メッセージをワーカーから Web サーバーに象徴的に伝える必要があることを意味します。ActiveModel エラーに対してこれを行う方法がわかりません。例えば:

class FibonacciCalculation
  include ActiveModel::Validations

  attr_reader :input
  validates_presence_of :input
  validates_inclusion_of :input, :in => 0..10_000,
                                 :allow_blank => true

  def initialize(params = {})
    @input = params[:input]
  end

  def output
    # do fibonacci calculation
  end
end

でそのようなオブジェクトを作成FibonacciCalculation.new(:input => -5)してからエラーを取得すると、ActiveModel::Errorsオブジェクトを取得できますが、それをシリアル化する方法がわかりません。を求めると、すでに翻訳されているerrors[:input]["can't be blank"]またはが得られます。["is not included in the list"]同様に、errors.as_json次のようなものを返します

`{ "errors" => [ "can't be blank" ] }`

またはのようなものを取得するにはどうすればよいです{ :input => [:blank] }{ :input => [:inclusion] }?

4

2 に答える 2

3

ActiveModel::Errorsエラーが追加されるとすぐに変換を行い、キーをシンボリックに保存しません。データを元に戻すには、次の 2 つの方法があります。

1.モンキーパッチ

ActiveModel::Errors.class_eval do
  old_generate_message = instance_method(:generate_message)
  def generate_message(attribute, type = :invalid, options = {})
    options[:type] ||
      old_generate_message.bind(self).call(attribute, type, options)
  end
end

2. 翻訳のオーバーライド

en:
  activerecord:
    errors:
      messages:
        blank: blank
        inclusion: inclusion
        ...

同じコードベースがワーカーと Web サーバーの両方を実行するため、どちらのケースも私にとっては注意が必要です。したがって、モンキー パッチまたは翻訳オーバーライドのいずれかを条件付きでロードする必要があります。

于 2013-01-02T17:11:37.847 に答える
0

私は同じ問題に遭遇しました。このケースを処理するために小さな宝石を作成しました

翻訳前に呼び出しmodel.errors.with_typesてエラーのタイプを取得できます。

于 2013-07-03T08:01:15.817 に答える