2016-09-26 13 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を使用できます。

次に、あなたのコントローラでこのようにそれを呼び出すことができます。

{ 
    "errors": { 
    "uuid": [ 
     "can't be blank" 
    ] 
    ... 
    } 
} 
+0

これが作業を行います。

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をレンダリングする必要があります。ありがとう。しかし、なぜバックスラッシュ「エラー」を出力するのだろうか?「{:uuid => [空白にすることはできません\」] – Tosh

+0

あなたの質問に追加できますか? – siegy22

+0

JSON形式のエラーを出力します。 – Tosh

関連する問題