皆様、こんにちわ。
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 は
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 コマンドでパスを確認できます。
実装後、フォームに情報を入力し、保存ボタンをクリックし、
情報が保存されたことを確認できました。