RESTfulコントローラーで新しいメソッドを定義する必要があるのはなぜですか?それをcreateメソッドでフォローアップしますか?
Google検索では、探していた答えが得られませんでした。私は違いを理解していますが、なぜそれらがそのまま使われているのかを知る必要があります。
RailsのRESTの実装では、newとcreateの扱いが異なります。
/resources/new
へのHTTP GETは、新しいリソースを作成するのに適したフォームをレンダリングすることを目的としています。これは、コントローラー内でnewアクションを呼び出し、新しい未保存レコードを作成し、形。
HTTP POST to /resources
は、newアクションの一部として作成されたレコードを取得し、コントローラー内のcreateアクションに渡します。その後、データベースに保存しようとします。
ActiveRecord :: Base ドキュメントから:
create(attributes = nil){| object | ...}
検証に合格した場合、オブジェクト(または複数のオブジェクト)を作成し、データベースに保存します。オブジェクトがデータベースに正常に保存されたかどうかにかかわらず、結果のオブジェクトが返されます。
new(attributes = nil){| block_givenの場合はself?| ...}
新しいオブジェクトは、空(構築パラメーターを渡さない)としてインスタンス化するか、属性で事前設定してまだ保存していない(関連するテーブル列名と一致するキー名でハッシュを渡す)ことができます。どちらの場合も、有効な属性キーは関連付けられたテーブルの列名によって決定されます。したがって、テーブル列の一部ではない属性を持つことはできません。
したがって、create
は新しいオブジェクトをインスタンス化し、検証してからデータベースに保存します。また、new
はローカルオブジェクトのみを作成し、検証またはDBへの保存を試行しません。
Newは新しいModelインスタンスをインスタンス化しますが、saveメソッドが呼び出されるまで保存されません。
Createは、newと同じことを行いますが、データベースにも保存します。
データベースに何かを保存する前に何かをしたい場合もあれば、すぐに作成して保存したい場合もあります。
RailsのRESTfulな部分は、HTTPプロトコルがどのように機能するかに非常に近くなるように作られています。 HTTPプロトコルでは、GETリクエストはデータを変更するものではありません。論理的に、Rails内のすべてのRESTfulアクションの動作を見ると、それらはHTTPアクションと一致します。 POSTは新しいデータを生成するためのものであるため、論理的に作成されます。 GETを使用して、そのフォームバージョン、つまり新しいアクションを提供します。インデックスとショーもGETであり、更新はPUT(またはRails 4+のPATCH)であり、破棄はHTTPのDELETEです。
さらに、コントローラー内のロジックを適切に分離し、エラーに対処するためのスムーズな方法を提供します(エラーメッセージで新しいアクションを再レンダリングすることにより)。