gpt4 book ai didi

ruby-on-rails - 如何序列化 ActiveModel 错误以供以后翻译?

转载 作者:行者123 更新时间:2023-12-04 05:17:04 24 4
gpt4 key购买 nike

我有一种情况,其中用户将一些数据提交到将在后台处理的 Web 服务器(Rails):

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

服务器响应一个指向后台作业的链接,用户可以使用该链接检查状态:
HTTP/1.1 202 Accepted
Location: http://example.com/jobs/5699121

需要注意的重要一点是,任何(授权)用户都可以检查作业的状态。这意味着我必须象征性地将任何错误消息从工作人员传回网络服务器。我想不出针对 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] } ?

最佳答案

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

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
...

这两种情况对我来说都很棘手,因为相同的代码库同时运行 worker 和 web 服务器。因此,我必须有条件地加载猴子补丁或翻译覆盖。

关于ruby-on-rails - 如何序列化 ActiveModel 错误以供以后翻译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14126164/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com