# form_withについて完全に理解するイベント
## 環境
- Rails7系
- Ruby3.2.2
## 使用するリポジトリ
https://github.com/kenchasonakai/form_with_sample
## 今日使うアプリの環境構築
使用するリポジトリに記載してあるURLをクリックしてREADME通りに環境構築してみよう
デバッグツールが仕込んであるのでタスクの作成はまだ行わないでください
## form_withってなんだ
<details>
<summary>考えてみよう!</summary>
セキュリティの考慮もした上でHTMLのformを簡単に作ってくれるすごいやつ
</details>
## form_withの基本的な書き方を見てみよう
### モデルと紐づくform_with
- [ユーザー作成ページにアクセス](http://localhost:3001/users/new)
```erb=
<h1>New User</h1>
<%= form_with model: @user do |f| %>
<div class="mb-3">
<%= f.label :email, class: 'form-label' %>
<%= f.email_field :email, class: 'form-control' %>
</div>
<div class="mb-3">
<%= f.label :password, class: 'form-label' %>
<%= f.password_field :password, class: 'form-control' %>
</div>
<%= f.submit nil, class: 'btn btn-primary' %>
<% end %>
<div class="mt-3"><%= link_to 'Login?', login_path %></div>
```
実際の要素(モデルと紐づく)
```
<div class="mb-3">
<label for="user_email">Email</label>
<input type="email" name="user[email]" id="user_email">
</div>
```
### モデルと紐づかないform_with
- [ログインページにアクセス](http://localhost:3001/login)
```erb=
<h1>Login</h1>
<%= form_with url: login_path do |f| %>
<div class="mb-3">
<%= f.label :email, class: 'form-label' %>
<%= f.email_field :email, class: 'form-control' %>
</div>
<div class="mb-3">
<%= f.label :password, class: 'form-label' %>
<%= f.password_field :password, class: 'form-control' %>
</div>
<%= f.submit nil, class: 'btn btn-primary' %>
<% end %>
<div class="mt-3"><%= link_to 'Sign up?', new_user_path %></div>
```
実際の要素(モデルと紐づかない)
```
<div class="mb-3">
<label for="email">Email</label>
<input type="email" name="email" id="email">
</div>
```
実際の要素を見比べてみるとname属性やfor・id属性に違いがあるのがわかりますね
### formのlabelについて
formにはlabelとinputを紐づける機能があります
紐付けを行うとlabelをクリックすると対応するinputにフォーカスが向きます
- id 属性を `<input>` 要素に追加
- for 属性を `<label>` 要素に追加
- for の値は `<input>` 要素の id と同じする
form_withを使うと自然と紐付けが行われます
## paramsについて
formから送るデータはControllerでparamsという形で送られます
その際にユーザーが入力したもの意外にもさまざまなデータが送られています
実際に見て見ましょう
下記のコマンドをコンテナの外で実行してください
```
docker attach form_with_sample-web-1
```
次にタスク作成ページにアクセスして何か値を入力してCreate Taskボタンを押して見ましょう
その後ターミナルを確認して`params`と実行して見ましょう
```
From: /app/app/controllers/tasks_controller.rb:24 TasksController#task_params:
22: def task_params
23: binding.pry
=> 24: params.require(:task).permit(:title, :body)
25: end
[1] pry(#<TasksController>)> params
=> #<ActionController::Parameters {"authenticity_token"=>"th85x7pYHxMsuVDPYHcGh23P5J6mNStUIYvLzfPkjj77I0wUpUTw6M2UBJtjq1tTOZoJhKtTUpKd_kswNQTg9g", "task"=>{"title"=>"aaa", "body"=>"body"}, "commit"=>"Create Task", "controller"=>"tasks", "action"=>"create"} permitted: false>
```