Rails新規vs作成


195

RESTfulコントローラーで新しいメソッドを定義する必要があるのはなぜですか?それに続いてcreateメソッドを使用しますか?

グーグル検索は私が探していた答えを私に提供しませんでした。私は違いを理解していますが、なぜ彼らがどのように使用されているのかを知る必要があります。

回答:


263

RailsのRESTの実装では、newcreateの扱いが異なります。

HTTP GET to /resources/newは、新しいリソースの作成に適したフォームをレンダリングすることを目的としています。これは、コントローラー内で新しいアクションを呼び出して、保存されていない新しいレコードを作成し、フォームをレンダリングします。

HTTP POST /resourcesは、新しいアクションの一部として作成されたレコードを取得し、それをコントローラー内の作成アクションに渡します。コントローラーは、それをデータベースに保存しようとします。


1
Railsチュートリアルサイトでこの情報を正確に流用しました。私が実際にそれを使用するまで、それは関連性があるようになりませんでした。
StorymasterQ 2016年

248

ActiveRecord ::ベースのドキュメント:

create(attributes = nil){|オブジェクト| ...}

検証に合格した場合、オブジェクト(または複数のオブジェクト)を作成し、データベースに保存します。結果のオブジェクトは、オブジェクトがデータベースに正常に保存されたかどうかに関係なく返されます。

new(attributes = nil){| self if block_given?| ...}

新しいオブジェクトは、空(構築パラメーターを渡さない)または事前設定された属性でインスタンス化できますが、まだ保存されていません(関連するテーブル列名と一致するキー名のハッシュを渡します)。どちらの場合も、有効な属性キーは、関連付けられたテーブルの列名によって決定されます。したがって、テーブルの列の一部ではない属性を持つことはできません。

そのcreateため、新しいオブジェクトをインスタンス化し、検証して、データベースに保存します。またnew、ローカルオブジェクトを作成するだけで、検証またはDBへの保存は試みません。


5
この質問は、モデルメソッドではなく、コントローラメソッドに関するものです。
sevenseacat 2012

8
@Karpie-反対投票をありがとう。あなたは良い点を述べますが、特にタイトルもタグもコントローラーのみの質問としてそれを呼んでいないので、多くの人がこの答えが役に立ったと考えてください。したがって、この答えはまったく同じ価値を提供すると思います。
ジャスティンエティエ

16

Newは新しいModelインスタンスをインスタンス化しますが、saveメソッドが呼び出されるまで保存されません。

Createはnewと同じように機能しますが、データベースに保存します。

何かをデータベースに保存する前に何かをしたい場合もあれば、すぐに作成して保存したい場合もあります。


1
この質問は、モデルメソッドではなく、コントローラメソッドに関するものです。
sevenseacat 2012

11

RailsのRESTfulな部分は、HTTPプロトコルの動作に非常に近くなるように作られています。HTTPプロトコルでは、GETリクエストがデータを変更することは想定されていません。論理的には、RailsのすべてのRESTfulアクションが機能する方法を見ると、それらはHTTPアクションと一致します。POSTは新しいデータを生成するためのものなので、論理的に作成されます。GETを使用して、そのフォームバージョン、つまり新しいアクションを提供します。インデックスとショーもGETであり、更新はPUT(またはRails 4+ではPATCH)であり、破棄はHTTPでのDELETEです。

さらに、コントローラー内のロジックを適切に分離し、エラーに対処するスムーズな方法を提供します(エラーメッセージで新しいアクションを再レンダリングすることにより)。


"You use a GET to serve the form version of that or in other words, the new action"回答に感謝しますが、個人的には、この命名規則は本当に混乱していると思います
Daniel Lizik
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.