【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の表示先を条件分岐で返す場合など