U_OK_2023’s blog

主に日々のプログラミング学習についてのアウトプットと備忘録

【保存】mergeメソッド【違うテーブルの情報を含める】

皆様、こんにちわ。
U_OK_2023 です。

本日も、夕方からWEB面接がありました。
結果は後日とのことです。

本日もオリジナルアプリの作成をしました。
前回、フォームに情報を入力できるところまでをしたので、
本日は、その入力した情報をテーブルに保存するところまでを実装しました。

まず、フォームで入力した情報をテーブルに保存するためには、
MVCの流れを意識します。

1️⃣ルーティングでcreateアクション設定する。
2️⃣コントローラーにcreateアクションを定義し、
 保存するために入力した情報を
 paramusで許可をする処理を記述する。
3️⃣情報を入力するビューのform_with に @モデル、url を設定する。

1️⃣ルーティングでcreateアクション設定する。

config/routes.rb

  resources :tasks, only: [:new, :create]

create は 保存するという意味ですね。
後ほどビューのフォームにパスを設定する必要があるため追加します。

2️⃣コントローラーにcreateアクションを定義し、
 保存するために入力した情報を
 paramusで許可をする処理を記述する。

app/controllers/tasks_controller.rb

  def create
    Task.create(task_params)
    redirect_to root_path
  end
  
  private

  def task_params
    params.require(:task).permit(:task_name, :description, :category_id, :deadline).merge(user_id: current_user.id)
  end

createアクションが実行される際、task_params を呼び出し、
ストロングパラメーターを使用し、保存する値を許可する。
その際、user_id は 「誰の」タスクなのかを紐付けるために、
usersテーブルとアソシーションを組んでいるため、取得できる値です。

上記コードの
:task_name, :description, :category_id, :deadline は tasksテーブルの情報です。
user_id は usersテーブルの情報です。

今回取得した tasksテーブルの user_id の 10 は

https://i.gyazo.com/087fd5a28a3528d2d87e60697b64d63e.png

usersテーブル の id の 10 のことです。

このように違うテーブルの情報を含めるためには mergeメソッドを使い
tasksテーブル と usersテーブル の情報を
merge(結合)することで情報を取得することができます。
merge(user_id: current_user.id) の意味は、
「user_idカラムに 現在ログインしているユーザー
(情報をフォームに入力したユーザー)の id の情報を tasksテーブルに結合する」
という意味になります。

3️⃣情報を入力するビューのform_with に @モデル、url を設定する。

最後にビューの設定です。
情報を送るために、form_with を使用します。

app/views/tasks/new.html.erb

<%= form_with model: @task, url: tasks_path, class: '***-main', local: true do |f| %>

model:@task の @task は コントローラーで newアクションを定義した際に生成した
@インスタンス変数 のことです。

  def new
    @task = Task.new
  end

url: tasks_path は ルーティングで create を 追加した際に生成されたパスです
ターミナルで rails routes コマンドでパスを確認できます。

https://i.gyazo.com/04f316817607ba7b2cec434281ebf483.png

実装後、フォームに情報を入力し、保存ボタンをクリックし、
情報が保存されたことを確認できました。