LoginSignup
22
17

More than 3 years have passed since last update.

Railsのcreateメソッドは保存に成功しても、失敗してもモデルオブジェクトを返す

Last updated at Posted at 2019-11-03

Railsのcreateメソッドは、オブジェクトの作成と保存を同時に実行できます。
注意点として、createメソッドは保存に成功しても、失敗してもモデルオブジェクトを返すので、saveメソッドのようにif文で保存成功可否を判定しようとすると、どちらの場合も必ず真になります。

環境

$ rails -v
Rails 5.1.7

検証

Userモデルの保存時に、nameを必須にします。

user.rb
class User < ApplicationRecord
    validates :name, presence: true
end

createメソッドは保存に成功しても、失敗してもモデルオブジェクトを返します。

# 保存成功
User.create(name: "testuser")
=> #<User id: 1, name: "testuser", created_at: "2019-11-03 14:22:46", updated_at: "2019-11-03 14:22:46"> 

# 保存失敗 
User.create(name: nil)
=> #<User id: nil, name: nil, created_at: nil, updated_at: nil> 

そのため、以下のようにcreateメソッドにif文を使うと、nameがnilで保存に失敗しますが、Userオブジェクトを返すのでifの条件式は真になります。
※Rubyのif文で偽になるのは、falseとnilのみ。

正しく動かない、保存処理
if User.create(name: nil) # 保存失敗だけど
  redirect_to successed_path # successed_pathに遷移してしまう
else
  redirect_to failed_path
end

正しく動くようにするには、以下のように実装してください。

正しく動く、保存処理
user = User.new(name: nil)
if user.save # 保存失敗して
  redirect_to successed_path
else
  redirect_to failed_path # failed_pathに遷移する
end

保存メソッドの返り値

メソッド 保存成功 保存失敗
save true false
create 保存に成功したオブジェクト 保存に失敗したオブジェクト

修正希望の記事

createメソッドの返り値がtrue, falseであると、記載されている記事です。

参考

22
17
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
22
17