オライリーの「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章はページ数もソースの変更箇所も少なかったので、すぐに終わってしまいました。