オライリーの「Head First Rails」で躓いたところ (6章)
そろそろ、中断期間が長いと頭がこんがらがってくるようになりました。複雑になってきてますね。
どこを編集したのかも分からなくなってくるので、勉強も兼ねてバージョン管理とかした方がいいのかもしんない。
躓いたところ
P222 アプリケーションの作成
もはやおなじみ。
rails new coconut
P222 Scaffoldの実行
これもいつも通り。
rails generate scaffold flight departure:datetime arrival:datetime destination:string baggage_allowance:decimal capacity:integer
もうひとつ。
rails generate scaffold seat flight_id:integer name:string baggage:decimal
rake db:migrate
するのを忘れずに。
P230 予約フォームのパーシャル
Rails4でScaffoldが作ってくれる「new.html.erb」はこんな感じです。
<h1>New seat</h1>
<%= render 'form' %>
<%= link_to 'Back', seats_path %>
本のサンプルと違って、<%= render 'form' %>
でフォームを埋め込んでいます。フォルダを見てみると、「_form.html.erb」っていうパーシャルも一緒に生成されていました。
これをそのまま使ってしまうと、flightsの新規作成フォームを埋め込むことになってしまいそうです。別フォルダのパーシャルを見に行くように出来れば問題なさそうですけど。
<h1>New seat</h1>
<%= render '/seats/form' %>
こんな感じで、パス付きで書いてあげればOKでした。どうやら、'form'
とパス無しで書くと同じフォルダから探して、パス付きだと「/app/views」の下から探すようです。便利。
これで本と同じエラーが出ました。
P235 パーシャルに変数を渡す
ちょっと困ったことになりました。
本では「show.html.erb」から「_new_seat.html.erb」を呼ぶだけなのですが、Rails4のScaffoldの作法に従うと、さらに「_form.html.erb」も絡んできます。
さきほど編集したところですが、「_new_seat.html.erb」をさらに変更。
<h1>New seat</h1>
<%= render '/seats/form', :seat=>seat %>
続いて/seatsの中の「_form.html.erb」も。
@seat
の@を取っただけですけど。
%= form_for(seat) do |f| %>
<% if seat.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(seat.errors.count, "error") %> prohibited this seat from being saved:</h2>
<ul>
<% seat.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :flight_id %><br>
<%= f.number_field :flight_id %>
</div>
<div class="field">
<%= f.label :name %><br>
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :baggage %><br>
<%= f.text_field :baggage %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
これで動きました。
renderに引数を渡すとき、本のように:partial=>"new_seat"
って書いたほうがいいのかなあ?