5.4 モデルと関連したフォーム
モデルに対応するフォームを生成する
モデルに対応するフォームを生成するにはform_for
を使います。
form_for(モデルオブジェクト [, オプション])
と記述することができます。オプションには以下を指定することができます。
オプション | |
---|---|
:url | 送信先 |
:namespace | 名前空間の指定 |
:html | HTMLオプションの設定 |
app/controllers/posts_controller.rb
class PostsController < ApplicationController
def new
@post = Post.new
end
end
app/views/posts/new.html.erb
<%= form_for @post do |f| %>
<%= f.text_field :title %>
<%= f.text_area :body %>
<%= f.submit "保存" %>
<% end %>
form_for
のブロック変数f
のフォームビルダーオブジェクトを利用してフォームパーツを生成します。
生成するパーツはオブジェクトのプロパティを指定することで、Railsが自動でモデルのハッシュを設定してくれます。
生成されるHTMLは以下になります。
<form class="new_post" id="new_post" action="/posts" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="authenticity_token" value="QuBqlQR1Eos2lVY7+629+FazQG6Q/Fmcjc+SlY1lEaDCrvGNgmBo4KqgwzvCFx5jkl7ZfYuVkqpmEV6yj5Eruw==">
<input type="text" name="post[title]" id="post_title">
<textarea name="post[body]" id="post_body"></textarea>
<input type="submit" name="commit" value="保存" data-disable-with="保存">
</form>
ネストしたモデルに対応するフォームを生成する
fields_for
メソッドを利用することで、ネストした関連モデルのフィールドも同一フォーム内で編集することができるようになります。
app/views/posts/new.html.erb
<%= form_for @post do |post_form| %>
<%= post_form.text_field :title %>
<%= post_form.text_area :body %>
<%= fields_for @post.build_author do |author_form| %>
<%= author_form.text_field :name %>
<% end %>
<% end %>
生成されるHTMLは以下になります。
<form class="new_post" id="new_post" action="/posts" accept-charset="UTF-8" method="post">
<input name="utf8" type="hidden" value="✓">
<input type="hidden" name="authenticity_token" value="6Pknr/M7HadbESRgtyH62ovO9PAtoJg1646GlX0iMjFot7y3dS5nzMcksWCOm1lBTyNt4zbJUwMAUEqyf9YIKg==">
<input type="text" name="post[title]" id="post_title">
<textarea name="post[body]" id="post_body"></textarea>
<input type="text" name="author[name]" id="author_name">
</form>
バリデーションのエラーを表示する
バリデーションのエラーはモデルオブジェクトの含まれているので以下のように一覧で出力することができます。
<% @post.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
またフォームヘルパーで生成したフォームはバリデーションのエラーがあった場合、そのプロパティに該当するフィールドを<div>
で囲ってくれます。
<div class="field_with_errors">
<input type="text" name="post[title]" id="post_title">
</div>
フォームのメソッドを設定する
フォームのメソッドはform_for
およびform_tag
のmethod
オプションで指定することができます。
<%= form_tag(search_posts_path, method: :get) do %>
<%= text_field_tag :q %>
<% end %>
以下のHTMLが生成されます。
<form action="/posts/search" accept-charset="UTF-8" method="get">
<input name="utf8" type="hidden" value="✓">
<input type="text" name="q" id="q">
</form>