環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15
はじめに
RailsでContollerを学ぶとnew,save,create,destroyなどのActive Recordメソッドを学びます。
その時にcreateメソッドはnew+saveと学びました。
初心者の私は「じゃあcreateの方が簡潔で見やすいからコッチを使うんだ!」と勘違いしていて自身のアプリを作成した時にcreateを用いてうまく動作しないことがあったので、その時の学びを書きます。
new + saveに分ける理由は?
要はcreateアクションでcreateメソッドを使わずにnew+saveを用いるときはどんなとき?
例えば、コントローラー内の記述
def create
@message = Message.create(message_params)
end
ではなく
def create
@message = Messages.new(message_params)
@message.save
end
こっち。
①ifなどを使った条件文を記載するとき
def create
@message = Messages.new(message_params)
if @message.save
redirect_to("該当パス")
else
flash.now[:alert] = 'メッセージを入力してください。'
render :index
end
end
上記にように条件文を使用する際にnew+saveと分けます。
下のようにcreateを使うとうまく条件文が動作せずelse後の作成失敗時に動作がうまく動かない。
def create
if Messages.create(message_params)
// 成功時の処理
else
// 失敗時の処理
end
end
これだとcreateに失敗してもオブジェクトを返すためif文が
trueとなり成功時の処理を行なってしまうからです。
また記述が多くなると分けた方が見やすい点もあります。
②renderを用いるとき
newを記載しておくとその時作成したインスタンスメソッドをrenderで使うことができる。上記の例にはないが:idを引き継いで利用したい場合もnewを記載した方がよい。
最後に
どちらでも意味は同じと言われるとどう違うのかと気になったので、また自分のミスもあったのでここに記しました。