2016-09-26 58 views
1

這是CreateSubscription服務類。我把這個邏輯放在服務中,因爲有api調用並且發生了一些數據插入。 (這是簡化版)錯誤處理返回服務中的錯誤對象

這個類基本上是從控制器調用的,我需要在那裏處理錯誤。 然而,問題是如何使用user.erros對象而不是full_messages觸發錯誤,以便我可以迭代錯誤並使用JSON創建錯誤響應。

{ 「錯誤」: 「UUID不能爲空,名稱不能爲空,而電子郵件是無效的」 }

{ 「錯誤 「:[{ 」的uuid「:[ 」不能爲空「 ],」 姓名」:[ 「不能爲空」] .. } ] }

服務/ 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 

UPDATE

控制器/ subscriptions_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 

回答

1

嘗試使用messagessee the docs):

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

此外,您可以添加自己的鑰匙做一個 「根」:

{errors: user.errors.messages} 

UPDATE:

你真的應該考慮重構你的代碼。 (See this why should not

要替換這個,您可以使用custom validators

然後你就可以在你的控制器這樣稱呼它:

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" 
    ] 
    ... 
    } 
} 
+0

這並不工作。謝謝。不過,我不知道爲什麼它輸出反斜槓「錯誤」:「{:uuid => [\」不能爲空\「]。 – Tosh

+0

您能否將它添加到您的問題如何使用它? – siegy22

+0

已更新。爲每個添加迭代器到箱子,但它基本上輸出JSON格式的錯誤。 – Tosh