36
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

【Rails】createメソッドとnew + saveメソッドの違い

Last updated at Posted at 2020-08-26

#環境
・Rails 6.0.3.2
・mysql Ver 14.14 Distrib 5.6.47
・osx10.15

#はじめに
RailsContollerを学ぶと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を記載した方がよい。

#最後に
どちらでも意味は同じと言われるとどう違うのかと気になったので、また自分のミスもあったのでここに記しました。

36
32
0

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
36
32

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?