1
1

【Rails】form_withにおけるmodel: とは何者か?

Last updated at Posted at 2023-12-26

注記
この記事の投稿者はRuby on Rails初学者であり、自身の学習の備忘録目的で記事投稿を行なっております。
情報の正確さには最大限注意をしておりますが、もし誤り等がございましたらお知らせいただけますと幸いです。

こんにちは!
ご覧いただきありがとうございます!
Ito と申します!
Ruby on Rails初学者です。
  
タイトルの通り
form_withにおけるmodel: とは何者か?
個人的にわかりにくいと感じたので、端的にまとめてみました。

場面設定

掲示板アプリを想定しています。

  • Postモデルのindexビューに、author(著者)を選択してpostを検索できる検索フォームを実装しています。
  • PostモデルがAuthorモデルと関連付けされています。
  • authorsテーブルとpostsテーブルは 一対多 の関係です。

モデル

app/models/post.rb
class Post < ApplicationRecord
  belongs_to :author

  #...(以下略)...
app/models/author.rb
class Author < ApplicationRecord
  has_many :posts
end

コントローラー

posts_controller.rb
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
# ...(以下略)

ビュー

app/views/posts/index.html.erb
<%= 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が何を表しているのか。

調べた結果

modelform_withにおける「オプション」のこと

そもそもform_withにおけるmodel:が何を表しているか?ですが、
model:とは、「フォームのモデルオブジェクトを指定するためのオプション」 のことです。

そして指定されるモデルオブジェクトには、「フォームで取り扱うデータを持つオブジェクト」 を指定します。
=> 今回はform_withで「検索フォーム」を実装しようとしているので、「フォームで取り扱うデータ」は 検索条件 (例えばauthortitleなど) となります。

その 検索条件 のデータを持っているオブジェクトを、model:オプションで指定しています。

具体的にコードの中身を見てみる

具体的にコードの中身を見てみます。
model: @search_posts_formにおける@search_posts_formの中身が何なのか?というと、
search_paramsを受け取り、newされた SearchPostsFormインスタンス が代入されています。

posts_controller.rb
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]のこと、ここでは割愛します)

posts_controller.rb
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:で指定されていました。

わかったことのまとめ

ここまでをまとめると、

  • modelform_withにおける 「オプション」 である。
  • model:で指定されるのは、「フォームで取り扱うデータを持つモデルオブジェクト」 である。
    => 今回のケースでは 「フォームから送信されたデータを受け取るモデルオブジェクト」 である。

文章で書くとややこしいですね…
もう少し端的に言い表すと

「検索フォームで送信する(選択する)データを持っているオブジェクトを、model:オプションで指定しなさいね」

ということになります。

所管

自分の頭では整理できたつもりですが、文章に表すと想像以上に複雑になってしまいました。
都度反芻しながら、データの流れを整理して理解を深めていきたいと思います。
以上です!
ご覧いただきありがとうございました!寒さに負けず学習頑張ります!:muscle:

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1