回答:
RailsのRESTの実装では、newとcreateの扱いが異なります。
HTTP GET to /resources/new
は、新しいリソースの作成に適したフォームをレンダリングすることを目的としています。これは、コントローラー内で新しいアクションを呼び出して、保存されていない新しいレコードを作成し、フォームをレンダリングします。
HTTP POST /resources
は、新しいアクションの一部として作成されたレコードを取得し、それをコントローラー内の作成アクションに渡します。コントローラーは、それをデータベースに保存しようとします。
ActiveRecord ::ベースのドキュメント:
create(attributes = nil){|オブジェクト| ...}
検証に合格した場合、オブジェクト(または複数のオブジェクト)を作成し、データベースに保存します。結果のオブジェクトは、オブジェクトがデータベースに正常に保存されたかどうかに関係なく返されます。
new(attributes = nil){| self if block_given?| ...}
新しいオブジェクトは、空(構築パラメーターを渡さない)または事前設定された属性でインスタンス化できますが、まだ保存されていません(関連するテーブル列名と一致するキー名のハッシュを渡します)。どちらの場合も、有効な属性キーは、関連付けられたテーブルの列名によって決定されます。したがって、テーブルの列の一部ではない属性を持つことはできません。
その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です。
さらに、コントローラー内のロジックを適切に分離し、エラーに対処するスムーズな方法を提供します(エラーメッセージで新しいアクションを再レンダリングすることにより)。
"You use a GET to serve the form version of that or in other words, the new action"
回答に感謝しますが、個人的には、この命名規則は本当に混乱していると思います