Railsでのフォームの作り方 その2

こんにちは!

今回はRailsでのフォームの作り方 その2です。

環境

Rails 5.2.8.1

フォームを作る2つの方法

form_tagを使う方法

  • 以前の記事でまとめた内容
  • モデルと関係のないフォームを作る場合に使用する

na-ah.hatenablog.com

form_forを使う方法

  • 今回まとめる内容
  • モデルと連携したフォームを作る場合に使用する

form_forの使い方

コード例

<%= form_for @member do |form| %>
  <%= form.text_field :number %>
  <%= form.text_field :name %>
<% end %>

解説

  • form_forの後にモデルオブジェクトを指定(例:@member)
  • |form|の中のformは、ActionView::Helpers::FormBuilderクラスのオブジェクト(フォームビルダーと呼ぶ)
  • フォームビルダーにメソッド(例:text_field)と、モデルの属性名を指定して使用する

フォームビルダーのメソッド例

text_field

  • 1行のテキスト入力欄を作る

text_area

  • 複数行のテキスト入力欄を作る

select

  • 選択リストを作る
    コード例
<% options = ["", "", ""] %>
時間帯: <%= form.select :time, options %>

submit

  • 送信ボタンを作る
    コード例
<%= form.submit "更新" %>

label

  • 入力欄に対応するラベルを作る
    コード例
<%= form.label :name, "名前" %>
<%= form.text_field :name %>

コントローラーでの使い方

コントローラーからフォームに渡すとき(new -> new.html.erb, edit -> edit.html.erb)

newの場合

  • @member = Member.new
    • 空のモデルを作成
    • フォームのそれぞれの欄は空白が表示される

editの場合

  • @member = Member.find(params[:id])
    • editアクションに渡されたparamsからモデルオブジェクトを検索して取得
    • フォームのそれぞれの欄は、現在のモデルオブジェクトの値が表示される

フォームの情報をコントローラーで受け取るとき (new.html.erb -> create, edit.html.erb -> update)

  • params[:member]でそれぞれのフォームの値をハッシュとして受け取る
    • 入れ子構造のハッシュになっているので、params[:member]の中身もハッシュになっている

newの場合

  • @member = Member.new(params[:member])
  • @member.save
    • フォームの内容を元に新規モデルオブジェクトを作成し、保存を試みる

editの場合

  • @member = Member.find(params[:id])
  • @member.assign_attributes(params[:member])
  • @member.save
    • 既存のモデルオブジェクトをparams[:id]から検索し、assign_attributesメソッドでフォームの入力値に全て更新し、保存を試みる

おわりに

今回はform_forを使用したフォームの作成方法についてまとめました。前回のform_tagを使用した方法としっかり区別して整理することで、Railsのフォーム作成について大分理解が深まりました。また、フォームの作成とフォームからの情報の送信の流れを整理することで、MVCモデルにおける7つのアクションの挙動についても0から書けるようになりました。これでRailsの第一関門は突破したと思いますので、更に知識を深めていきたいと思います。

46/100