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であると、記載されている記事です。