Ruby on RailsのActiveRecordで使われるsaveとsave!。この二つのメソッドの違いについて、改めて学習した内容をメモとして記録しておきます。
saveメソッド
- Ruby on RailsのActiveRecordで扱うメソッド。
- データベースへの保存を試みるメソッドである。
-
save
とsave!
の2種類がある。 -
「!」
は、日本語では感嘆符
、カッコよく言うとエクスクラメーションマーク
と呼ぶ。 - ビックリマークとは呼ばないww
saveとsave!
-
save
とsave!
両メソッドは一見同じように思えるが、その挙動には違いがある。 - 両者の違いは、保存に失敗したときの挙動にある。
-
save
は、バリデーションに失敗するとfalseを返す。 -
save!
は、バリデーションに失敗するとActiveRecord::RecordInvalid
という例外を発生させる。
-
-
save!
はエラーを厳しくチェックするバージョンのsave
だと言える。
コード間違い例
class PostsController < ApplicationController
def index
@posts = Post.all
end
def create
@post = Post.new(post_params)
if @post.save! #ここに注目
redirect_to @post
else
render :new
end
end
private
def post_params
params.require(:post).permit(:title, :content)
end
end
- 投稿を保存する
PostsController
のコードの一部。 -
create
メソッドにおいて新しい投稿(Post)を作成し、データベースへの保存を試みている。 -
if
文を用いて、保存が成功した場合は投稿したpostの画面に遷移させている。 - 保存に失敗した場合には、
render :new
によって、postの新規作成画面に戻るように指示している。 - ここで、注目すべきなのが、
if @post.save
である。 -
if
文を使って、成功した場合、失敗した場合、両方の真偽値に応じた挙動を支持するところなのだが、save!
メソッドの場合、保存失敗は例外を返すという特徴があるため、else
の次のrender :new
が実行されずに例外処理が実行されてしまう。 - そのため、今回の例においては、以下のように
save!
メソッドではなく、save
メソッドを用いるのが良い。
コード正解例
def create
@post = Post.new(post_params)
if @post.save # この場合「save!」ではなくこっちが正解
redirect_to @post
else
render :new
end
end
参考サイト