【Rails】 saveとsave!の違いについて

目次:

saveとsave!の違いについて

• save -> 保存できない場合はfalse
• save! -> 保存できない場合はActiveRecord::RecordInvalid例外発生

具体的に

rails consoleで検証

= saveの場合 =

Userモデルでvalidates :name, presence: trueバリデーション定義
presence: true とは、カラムの中身が空でないことを意味します。 )

bin/rails c //コンソール起動
user = User.new(name: nil)
user.save

=> false

結果falseが帰ってきます。

= save!の場合 =
bin/rails c //コンソール起動
user = User.new(name: nil)
user.save!

=> ActiveRecord::RecordInvalid
ActiveRecord::RecordInvalid (バリデーションに失敗しました: nameを入力してください)

結果:ActiveRecord::RecordInvalidが返ってきます。
save!によってActiveRecord::RecordInvalidが発火

エラー内容の確認方法

user.error

user.error
=> #<ActiveModel::Errors:0x00007fc9c0999968 @base=#<User...... >,
 @messages={:password=>["を入力してください"], 
:name=>["を入力してください"], 
:email=>["を入力してください"]}, 
@details={:password=>[{:error=>:blank}], 
:name=>[{:error=>:blank}], :email=>[{:error=>:blank}]}>

という詳細なエラーが確認できます

user.error.full_message

user.error.full_message
=> ["パスワードを入力してください", "名前を入力してください", "メールアドレスを入力してください"]

エラー内容がわかりやすくみれます。(実際のエラーは設定によって表示方法がかわります)

saveとsave!の使い分け

例えばrailsのコントローラーで検証する場合

  def create 
    @user = User.new(user_params)

    if @user.save
      redirect_to admin_users_path, notice: "ユーザー「#{@user.name}」を登録しました。"
    else
      render :new
    end

    private

    def user_params
      arams.require(:user).permit(:name, :email, :admin, :password, :password_confirmation)
    end
  end

save!ではなくsaveで戻り値falseだったとき、
Viewの表示先を条件分岐で返す場合など