【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

まとめ

Railsnewアクションとcreateアクションは、Webアプリケーションがステートレスなため、それぞれ異なるリクエストとして独立して動作します。
そのため、createアクションで新たにオブジェクトを生成することで、データの保存を実現しています。