gpt4 book ai didi

ruby-on-rails - 在服务中返回错误对象的错误处理

转载 作者:行者123 更新时间:2023-12-03 07:53:48 25 4
gpt4 key购买 nike

这是 CreateSubscription 服务类。我将这个逻辑投入使用,因为有 api 调用并且发生了一些数据插入。
(这是简化版。)

这个类基本上是从 Controller 调用的,我需要在那里处理错误。
但是问题是如何使用 触发错误用户错误 对象而不是 full_messages,这样我就可以迭代错误并使用 JSON 创建错误响应。

{
"error": "Uuid 不能为空,Name 不能为空,Email 无效"
}




{
“错误”:[
{
“uuid”:[
“不能为空”
],"name": ["不能为空"]..
}
]
}


服务/create_subscription.rb

class CreateSubscription
class UserCreateError < StandardError; end

def self.call(plan, user_info:)
subscription = nil
ActiveRecord::Base.transaction do
user = CreateUser.call(user_info)
raise UserCreateError.new(user.errors.full_messages.to_sentence) unless user.valid?

服务/create_user.rb
class CreateUser
def self.call(payment_info)
uuid = payment_info[:uuid]
name = payment_info[:name]
email = payment_info[:email]

user = User.find_by(uuid: uuid)
return user if user.present?

user = User.create(
uuid: uuid,
name: name,
email: email
)
user
end
end

更新

Controller /订阅 Controller .rb
 def create
# Some logic ....
rescue CreateSubscription::UserCreateError => e
# TODO: This should be an array, not only each one
render json: { error: e.message }, status: :bad_request

最佳答案

尝试使用 messages (see the docs):

user = User.create
user.save # => false
user.errors.messages # => {uuid: ["cannot be blank"], name: ["cannot be blank"]}

此外,您可以添加自己的 key 来创建“root”:
{errors: user.errors.messages}

更新:

你真的应该考虑重构你的代码。
您正在使用 Exception 作为控制流.. ( See this why should not )

要替换它,您可以使用 custom validators .

然后你可以在你的 Controller 中这样调用它:
def create
user = User.new(<params>)
if user.save
# do whatever you like, most likely a redirect
else
render json: { errors: user.errors.messages }, status: bad_request
end
end

这应该呈现一个像这样的 json:
{
"errors": {
"uuid": [
"can't be blank"
]
...
}
}

关于ruby-on-rails - 在服务中返回错误对象的错误处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39700314/

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