ほねにくのうわずみ

私(@honeniq)の個人ブログです。日々の生活の中で感じた諸々のことから、人様にお見せできるような上澄み部分を抽出して投稿しています。

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

そろそろ、中断期間が長いと頭がこんがらがってくるようになりました。複雑になってきてますね。

Head First Rails ―頭とからだで覚えるRailsの基本

Head First Rails ―頭とからだで覚えるRailsの基本

どこを編集したのかも分からなくなってくるので、勉強も兼ねてバージョン管理とかした方がいいのかもしんない。

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"って書いたほうがいいのかなあ?