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对象,但我不知道如何序列化它。Asking forerrors[:input]给我["can't be blank"]or ["is not included in the list"],已经翻译好了。同样,errors.as_json返回类似

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

我怎样才能得到类似{ :input => [:blank] }or的东西{ :input => [:inclusion] }

4

2 回答 2

3

ActiveModel::Errors添加错误后立即进行翻译,并且它不会象征性地存储密钥。这留下了两种方法来获取数据:

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

我遇到了同样的问题,我创建了一个小宝石来处理这种情况,希望这会对某人有所帮助:https ://github.com/Intrepidd/activemodel_errors_type

您可以在翻译之前致电model.errors.with_types以获取错误的类型。

于 2013-07-03T08:01:15.817 回答