注記
この記事の投稿者はRuby on Rails初学者であり、自身の学習の備忘録目的で記事投稿を行なっております。
情報の正確さには最大限注意をしておりますが、もし誤り等がございましたらお知らせいただけますと幸いです。
こんにちは!
ご覧いただきありがとうございます!
Ito と申します!
Ruby on Rails初学者です。
タイトルの通り
form_withにおけるmodel: とは何者か?
個人的にわかりにくいと感じたので、端的にまとめてみました。
場面設定
掲示板アプリを想定しています。
-
Post
モデルのindex
ビューに、author
(著者)を選択してpost
を検索できる検索フォームを実装しています。 -
Post
モデルがAuthor
モデルと関連付けされています。 -
authors
テーブルとposts
テーブルは 一対多 の関係です。
モデル
class Post < ApplicationRecord
belongs_to :author
#...(以下略)...
class Author < ApplicationRecord
has_many :posts
end
コントローラー
class Admin::PostsController < ApplicationController
# ...(中略)
def index
@search_posts_form = SearchPostsForm.new(search_params)
end
# ...(中略)
private
def search_params
params[:q]&.permit(:title, :author_id)
end
# ...(以下略)
ビュー
<%= form_with model: @search_posts_form, scope: :q, url: posts_path, method: :get do |f| %>
<%= f.select :author_id, Author.pluck(:name, :id) , { include_blank: true }, class: 'form-control' %>
<%= f.submit '検索' %>
<% end %>
知りたかったこと
model: @search_posts_form
が何を表しているのか。
調べた結果
model
はform_with
における「オプション」のこと
そもそもform_with
におけるmodel:
が何を表しているか?ですが、
model:
とは、「フォームのモデルオブジェクトを指定するためのオプション」 のことです。
そして指定されるモデルオブジェクトには、「フォームで取り扱うデータを持つオブジェクト」 を指定します。
=> 今回はform_with
で「検索フォーム」を実装しようとしているので、「フォームで取り扱うデータ」は 検索条件 (例えばauthor
やtitle
など) となります。
その 検索条件 のデータを持っているオブジェクトを、model:
オプションで指定しています。
具体的にコードの中身を見てみる
具体的にコードの中身を見てみます。
model: @search_posts_form
における@search_posts_form
の中身が何なのか?というと、
search_params
を受け取り、new
された SearchPostsForm
インスタンス が代入されています。
class Admin::PostsController < ApplicationController
# ...(中略)
def index
@search_posts_form = SearchPostsForm.new(search_params) # この部分
end
# ...(中略)
private
def search_params
params[:q]&.permit(:title, :author_id)
end
# ...(以下略)
SearchPostsForm
インスタンスはsearch_params
を受け取っていますが、
じゃあsearch_params
の中身は何なのか、と言いますと
「検索フォームから送信された情報」になっています。
(params[:q]
のこと、ここでは割愛します)
class Admin::PostsController < ApplicationController
# ...(中略)
def index
@search_posts_form = SearchPostsForm.new(search_params)
end
# ...(中略)
private
def search_params
params[:q]&.permit(:title, :author_id) # この部分
end
# ...(以下略)
検索フォームで扱うデータをしっかりと持っている(持つことになっている?)モデルオブジェクトがmodel:
で指定されていました。
わかったことのまとめ
ここまでをまとめると、
-
model
はform_with
における 「オプション」 である。 -
model:
で指定されるのは、「フォームで取り扱うデータを持つモデルオブジェクト」 である。
=> 今回のケースでは 「フォームから送信されたデータを受け取るモデルオブジェクト」 である。
文章で書くとややこしいですね…
もう少し端的に言い表すと
「検索フォームで送信する(選択する)データを持っているオブジェクトを、model:
オプションで指定しなさいね」
ということになります。
所管
自分の頭では整理できたつもりですが、文章に表すと想像以上に複雑になってしまいました。
都度反芻しながら、データの流れを整理して理解を深めていきたいと思います。
以上です!
ご覧いただきありがとうございました!寒さに負けず学習頑張ります!