質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

Q&A

解決済

1回答

2970閲覧

【RailsAPI】例外処理 create! or createなのか ベストプラクティスを知りたいです。

nyako

総合スコア45

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

0グッド

0クリップ

投稿2021/06/05 10:36

状況

Rails APIに処理が失敗しても成功しても、てフロント側(React)にjsonでエラーメッセージを送りたいときがあるとします。

現在Userモデルに対してcreateを行なっていますが、バリデーションがかかって上手く処理ができないとします。
save!とすると例外処理がレスポンスとして(バリデーションのメッセージ)かえってくるとは思いますが、saveとすると "失敗しました"とフロント側に送られます。

どう使い分けるべきなのでしょうか?

そもそもif文での分岐と例外処理を出す時の違いはいまいち調べても分かりません。。。

宜しくお願い致します。

def create

ruby

1 2def create 3 4if User.create 5 render status: 200 , json: {message : "成功しました。"} 6else 7 render status: 400 , json:{ message : "失敗しました。"} 8end 9 10end 11

ruby

1def create 2 3begin 4 User.create! 5 render status: 200 , json: {message : "成功しました。"} 6else 7 render status: 400, json: { message : "失敗しました。"} 8end 9 10end 11

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

一般的なサービスにおいて1つのテーブルだけを更新するといった事は少なくて、
だいたい複数のテーブルをまとめて更新するようなケースが多いです。
そのためには、トランザクションを用いて成功(commit)か失敗(rollback)の状態にする必要があります。
例えば、A、B、Cのテーブル3つを同時に更新する必要があったとして、
何らかの不備(パラメータの間違いなど)があった時、基本的にA,B,Cに対して一切の変更がされてはいけません。
なので、rollbackするべきです。

こういう時は

ruby

1ActiveRecord::Base.transaction do 2 A.create!(...) 3 B.create!(...) 4 C.create!(...) 5end

という感じで、トランザクションのブロックで囲み、
失敗したら例外を発生させる=rollbackが実行されるという状態にする必要があります。
なので、基本的にcreate!、update!、save!など失敗したら例外が発生するメソッドを使うべきです。
逆に、create, update, saveの出番はありません。
通常のケースでも常にcreate!、update!、save!で良いくらいです。

さて、基本的にReactとRailsでアプリを作る場合、Rails=コントローラ側はjsonを返すだけになります。

ruby

1class XxxxController 2 3 def sample 4 begin 5 ActiveRecord::Base.transaction do 6 更新処理 7 end 8 9 # 成功時に返すべきレスポンスを設定 10 result = { 11 } 12 13 14 # jsonを返す。HTTPステータスコードは成功を示す200になる(statusオプション省略時) 15 render json: result 16 rescue Excetption => e 17 # エラーを示すレスポンス 18 result = { 19 error: { 20 message: e.message 21 } 22 } 23 24 # HTTPステータスコードは実際にはある程度使い分ける必要がある気がするが、 25 # 成功時200とエラー時(200以外)でReact側で判定すれば良いと思う 26 27 render json: result, stauts: 500 28 end 29 end 30 31end

要点は、データベースへの変更はトランザクションを使う。
ロールバックをするには必ずビックリマーク付きのメソッドを使う(create!, update!, save!)です。

投稿2021/06/05 10:51

mingos

総合スコア4027

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nyako

2021/06/07 06:28

本当にご丁寧なご回答ありがとうございます。トランザクションとは知らない概念で大変勉強になりました。大事な事を知れて嬉しかったです。 既存の現在開発しているコードを全て見直すことになりました。 3点ほど気になることがございまして、 コードブロックで書きたかったので別ページで載せてみました。 以下になります。 https://teratail.com/questions/342651 宜しくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問