【Rails】newアクションでオブジェクトを作ったのに、なぜcreateアクションでも再度オブジェクトを作るのか
Railsの学習をしていて、newアクションで新規登録用のオブジェクトを作ったんだから、それをそのままcreateアクションで使ってくれよと思ったことがありました。
def create @user = User.new(user_params) if @user.save # 保存成功時の処理 else # 保存失敗時の処理 end end def new @user = User.new end
かなり基本的なことではありますが、newアクションでオブジェクトを作ったのに、なぜcreateアクションでも再度オブジェクトを作るのかを改めて調べてみました。
結果:Webアプリのステートレスな性質によるもの
Webアプリケーションは基本的に「ステートレス」です。
つまり、各リクエストは独立しており、1つのリクエストで作成された変数やオブジェクトは、次のリクエストで自動的に保持されません。
newアクションとcreateアクション
例えば、以下のようなnew
アクションがあるとします。
def new @user = User.new end
new
アクションは、ユーザーにデータ入力のためのフォームを表示する役割があります。
ここで生成された@user
オブジェクトは、ビューでのフォーム表示のためだけに使われます。
# new.html.erb <%= form_for @user do |f| %> <!-- フィールドの入力 --> <%= f.submit '登録' %> <% end %>
一方、create
アクションは、このフォームから送信されたデータを受け取って、データベースに保存する役割があります。
ここで新しいUserオブジェクトを生成する理由は、前述したステートレスな性質によるものです。
new
アクションで生成された@user
はこのcreate
アクションでは利用できないため、新たにオブジェクトを生成して、フォームから送信されたデータを使ってデータベースに保存します。
def create @user = User.new(user_params) if @user.save # 保存成功時の処理 else # 保存失敗時の処理 end end
まとめ
Railsのnew
アクションとcreate
アクションは、Webアプリケーションがステートレスなため、それぞれ異なるリクエストとして独立して動作します。
そのため、create
アクションで新たにオブジェクトを生成することで、データの保存を実現しています。