Ruby
Rails

form_for内で、モデルオブジェクトにアクセスする

はじめに

form_forはモデルに基づいた、フォームを作成するときに使用します。
今回はform_for内で、そのモデルオブジェクトにアクセスしたい場合について紹介します。

form_forの使い方

まずは基本的なform_forの使い方について説明します。

form_forを使うことでモデルに基づく、テキストフィールドやラジオボタン、セレクトボックス等を簡単に作ることができます。

_form.erb.html
<%= form_for @article, do |f| %>
  <%= f.text_field :title %>
  <%= f.select :genre, [["文学", "文学"], ["文芸作品", "文芸作品"], ["エッセー", "エッセー"] %>
  <%= f.submit %>
<% end %>

form_for内でモデルオブジェクトにアクセスする。

フォーム変数fをf.objectとすることによって、関連付けられたオブジェクトにアクセスできます。
つまりf.object.imageは、@article.imageを指すことになります。

_form.erb.html
<%= form_for @article, do |f| %>
  <%= f.text_field :title %>
  <%= f.select :genre, [["文学", "文学"], ["文芸作品", "文芸作品"], ["エッセー", "エッセー"]] %>
  <%= image_tag f.object.image %>
  <%= f.submit %>
<% end %>

さいごに

has_many関係にある子モデルで、accepts_nested_attributes_forを使用したときに、
その子モデルオブジェクトに個別にアクセスしたくて、f.objectを知りました。

ですが、f.objectはRailsチュートリアルにも書かれている基本的なことだったようです。
(第4版: 13.3 マイクロポストを操作する)

Railsチュートリアルは以前やりましたが、今回のように理解が抜けている点もあると思うので、もう一度やってみようと思いました。
https://railstutorial.jp/chapters/user_microposts?version=5.0#sec-manipulating_microposts