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_tagmethodオプションで指定することができます。

<%= 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>

results matching ""

    No results matching ""