.build、.create、および.createの違い そして、それらはいつ使用されるべきですか?


167

したがって、.build、.create、および.createを使用している人を見てきました。最近、コントローラーの中でますます増えています。.newを使用してparam'dオブジェクトを渡し、次に.saveを渡すこととの違いは何ですか?長所と短所はありますか?これらの他の方法を使用すると、メリットがありますか?

回答:


233

いくつかの違いがありますが、大きくはありません。

  1. .create.new後にが続くことと同じ.saveです。それはもっと簡潔です。
  2. .create!.new続く.save!(保存に失敗した場合はエラーをスローする)と同じです。また、ほんの少し短いです
  3. 私が考えて.buildいるほとんどの別名.new。これは、1つのRails 3の道作品とRails内の別の方法<3.xのを

ただし、最も重要な部分は、これらのメソッドを関連付け(has_manyなど)を介して呼び出し、2つのモデルを自動的にリンクできることです。


1
関連するモデルをモデルにリンクできることについて言及しているので、これを最も正しい答えとして選択しました。これは、.newと.saveを使用する上で私が考える興味深い重要な違いです。少し余分な作業が必要です。ありがとう。
Tim Knight

11
3のマイナーな説明-ビルドは単なる新しいものではなく、関連付けリンクを設定します。
2ビットギャングスター

116
ビルドは新規とは異なります。しかし、違いは関連リンクを設定することではありません(Newは新しいインスタンスに対してもそれを行います)。違いは、Buildは呼び出し元に新しいインスタンスを入力しますが、Newはそうしません。たとえば、Wall.posts.newはWallに関連付けられた新しい投稿を提供しますが、Wall.postsはこの呼び出しの後も空のままです。Wall.posts.buildはあなたのWallに関連付けられた新しい投稿を提供し、Wall.postsには1つの投稿が含まれています。
アミンアリアナ

3
特別な機能を持たない、単なるエイリアスではありませんか?
Gabriele Cirulli 2013

14
Rails 4では、コンソールをチェックインしました。wall.posts.newとwall.posts.buildはどちらも、まったく同じ方法でwallオブジェクトにデータを入力しています。Aminのコメントで主張されているように、wall.posts.new、wall.postsが空ではないことを意味します。
ボット2013年

35

正しいですが、create呼び出しnewた後およびsaveその戻り値の二つの選択肢の間には大きな差があります。

Saveオブジェクトがデータベースに正常に保存されたかどうかに応じて、trueまたはを返しますfalse。これは、上記の質問の最初の例のように、フロー制御に使用できます。

Createオブジェクトが保存されたかどうかに関係なく、モデルを返します。これはif、オブジェクトが検証に失敗して保存されない場合でも、ステートメントの一番上の分岐が常に実行されるという点で、上記のコードに影響を与えます。

create分岐ロジックを使用する場合、new+ を使用する場合には当てはまらない、サイレント障害のリスクがありますsave

create! レコードが無効な場合に発生し、例外が発生するため、同じ問題の影響を受けません。

create代替は、コントローラに有用であることができるrespond_withAPI(JSON / XML)応答に使用されます。この場合、オブジェクトにエラーが存在すると、ステータスがのレスポンスでエラーが返されunprocessable_entityます。これは、APIから要求するものとまったく同じです。

特にフロー制御の戻り値に依存している場合は特に、html のnew+ saveオプションを常に使用します。


6

#createは、newおよびsaveの短縮バージョンです。#作成!検証が肯定的でない場合、例外がスローされます。


5

上記の回答の2番目です。さらに、で実行できる引数としてcreate渡すfalseことはできませんsavefalse引数として渡すと、すべてのレール検証がスキップされます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.