f.objectの仕組み

f:id:ryoutaku_jo:20190501114108p:plain

【結論】

・f.objectのobjectは、
 form_withやform_forなどのオプション

・formのブロック変数に対して使用する事で
 ブロック内でモデルオブジェクトを
 呼び出す事が出来る。

・同じコードを流用する際に、
 変数を変える必要が無くなる

【目次】

【本題】

f.objectについて

form_withやform_forを利用していると、
何度か目にする機会があるのが、
「 f.object」です。

今回は、この「 f.object」がどういった役割をになっているか解説します。

実装例

まず、参考例として、下記の様なフォームを用意しました。

f:id:ryoutaku_jo:20190501113539g:plain

タイトルには、presence: trueでバリデーションを設定しており、
空白だとエラーメッセージが表示される様になっています。

この画面のコードは、下記の通りです。

= form_with(model: @post, local: true) do |f|
  = f.label :title
  = f.text_field :title
  = f.object.errors.full_messages_for(:title).join(',')
(中略)

エラーメッセージを表示させる箇所で、
f.objectを利用しています。

ちなみに、 f.objectは、下記の様に書き換えても、正常に動作します。

= form_with(model: @post, local: true) do |f|
  = f.label :title
  = f.text_field :title
  =@post.errors.full_messages_for(:title).join(',')
(中略)

つまり、 「f.object」は
formのブロック内で、モデルオブジェクトを
呼び出す為のコードという事が分かります。

利用シーン

例えば、Post以外のモデルでフォームを生成したい場合、
エラーメッセージを表示させるコードは流用させたいですが、
変数で指定をしていると、都度、その部分を修正しなければなりません。

しかし、f.objectで指定をすれば、その手間は省けます。

この様に、f.objectは、
コードを再利用しやすくする為に用いられています。

参考情報

Ruby - インスタンスではなくf.objectを使う理由を知りたい|teratail

form objectを使ってみよう - メドピア開発者ブログ

form_for の f.object って何だ?(Rails) | もんセレクション

《今日の学習進捗(3年以内に10000時間に向けて)》

平成から令和に変わったというのに、全く実感なし。 毎日、開発三昧のせいです。 GWという事もあって、Qiitaが過疎っているので、 変に反響を気にせず投稿が出来て気楽ではある。

学習開始からの期間 :144日
今日までの合計時間:1397h
一日あたりの平均学習時間:9.8h
今日までに到達すべき目標時間:1315h
目標との解離:82h
「10,000時間」まで、

残り・・・「8603時間!」