こんにちは!
今回はRailsでのフォームの作り方 その2です。
環境
Rails 5.2.8.1
フォームを作る2つの方法
form_tag
を使う方法
- 以前の記事でまとめた内容
- モデルと関係のないフォームを作る場合に使用する
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