オライリーの「Head First Rails」で躓いたところ (6章)
そろそろ、中断期間が長いと頭がこんがらがってくるようになりました。複雑になってきてますね。
Head First Rails ―頭とからだで覚えるRailsの基本
- 作者: David Griffiths,松田明,児島修
- 出版社/メーカー: オライリージャパン
- 発売日: 2010/01/18
- メディア: 大型本
- 購入: 11人 クリック: 273回
- この商品を含むブログ (31件) を見る
どこを編集したのかも分からなくなってくるので、勉強も兼ねてバージョン管理とかした方がいいのかもしんない。
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"
って書いたほうがいいのかなあ?