#環境
・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
を記載した方がよい。
#最後に
どちらでも意味は同じと言われるとどう違うのかと気になったので、また自分のミスもあったのでここに記しました。