オライリーの「Head First Rails」で躓いたところ (5章)

ここ1ヶ月ほど、MacBookAirでエディタとターミナルを開きっぱなしです。思い立ったらすぐに始められる環境って大事ですね。

5章は入力データのバリデーションがテーマです。

ここに来て、3章でお別れした筈のMeBayが復活してくるとは。現実では、数年前に終わった案件の修正で呼び出しを食らったりもするので、これはかなり生々しい演出ですね。

躓いたところ

P212 エラーメッセージのメソッド

undefined method `error_messages'

そんなメソッド知らないよ、と。
どうも、Rails3以降ではこのメソッドは無くなっているようです。

参考: `error_messages’ メソッドが廃止されていた

client_workoutsアプリを参考に

Scaffoldで生成したclient_workoutsアプリではどうなっているのかとビューのソースを見てみます。
「_form.html.erb」の序盤にエラー関係のコードがありました。

  <% if @client_workout.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@client_workout.errors.count, "error") %> prohibited this client_workout from being saved:</h2>

      <ul>
      <% @client_workout.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>

エラーが発生している場合は、エラーの件数を教えてあげて、それからエラー内容もeachで全部表示するっていう流れでしょうか。

特に問題なく使い回せそうなので、オブジェクトだけ「ad」に変えてコピペします。
出来上がった「new.html.erb」はこんな感じ。

<h1>New Ad</h1>
<%= form_for(@ad,:url=>{:action=>'create'}) do |f| %>
  <% if @ad.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@ad.errors.count, "error") %> prohibited this ad from being saved:</h2>

      <ul>
      <% @ad.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <p><b>Name</b><br /><%= f.text_field :name %></p>
  <p><b>Description</b><br /><%= f.text_area :description%></p>
  <p><b>Price</b><br /><%= f.text_field :price %></p>
  <p><b>Seller</b><br /><%= f.text_field :seller_id %></p>
  <p><b>Email</b><br /><%= f.text_field :email %></p>
  <p><b>Img Url</b><br /><%= f.text_field :img_url %></p>
  <p><%= f.submit "create" %></p>
<% end %>

これでエラー表示が出るようになりました。

旧バージョンでは1行で書けていたのに、新バージョンではしっかり書いてあげないといけないんですね。珍しいパターン。

P216 編集ページのエラー表示

ひとつ上とやっていることは同じですが、せっかくなので「edit.html.erb」を全部載せておきます。

<h1>Editing <%= @ad.name %></h1>
<%= form_for(@ad,:url=>{:action=>'update'}) do |f| %>
  <% if @ad.errors.any? %>
    <div id="error_explanation">
      <h2><%= pluralize(@ad.errors.count, "error") %> prohibited this ad from being saved:</h2>

      <ul>
      <% @ad.errors.full_messages.each do |msg| %>
        <li><%= msg %></li>
      <% end %>
      </ul>
    </div>
  <% end %>
  <p><b>Name</b><br /><%= f.text_field :name %></p>
  <p><b>Description</b><br /><%= f.text_area :description%></p>
  <p><b>Price</b><br /><%= f.text_field :price %></p>
  <p><b>Seller</b><br /><%= f.text_field :seller_id %></p>
  <p><b>Email</b><br /><%= f.text_field :email %></p>
  <p><b>Img Url</b><br /><%= f.text_field :img_url %></p>
  <p><%= f.submit "update" %></p>
<% end %>

5章はページ数もソースの変更箇所も少なかったので、すぐに終わってしまいました。