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

オライリーの「Head First Rails ―頭とからだで覚えるRailsの基本」でお勉強中です。

3年前くらいの本です。その間にRailsはメジャーバージョンで2つも上がってしまっているので、本の通りには進めない部分が沢山。
第1章の頭から何カ所か躓いているので、対策を含めてメモ。

環境


躓いたところ

P7 rails ticketが通らない。

ticketプロジェクトを作成しようとしているところ。
新しいバージョンだと、rails new ticketとするのが正解。

P7 プロジェクト作成中にエラー((これはRailsのバージョンの問題ではなく、OSX側が原因ぽいです。))

newをつけて実行すると、ファイルの作成とか色々やってくれた後に、エラーでこける。

Installing atomic (1.1.14) 
Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension.

(中略)

An error occurred while installing atomic (1.1.14), and Bundler cannot continue.
Make sure that `gem install atomic -v '1.1.14'` succeeds before bundling.

指示通りにバージョン指定してatomicのみをインストールしてみるも、またもやエラー。

/Users/honeniq/.rbenv/versions/1.9.3-p125/lib/ruby/1.9.1/mkmf.rb:381:in `try_do': The compiler failed to generate an executable file. (RuntimeError)
You have to install development tools first.

ん?? develipment toolsって何??

gccのリンクを作ってあげる

どうやら、gccが見つからなくてエラーになっていたようです。
見つけられるようにリンクを作ってあげれば通りました。

sudo ln -s /usr/bin/gcc /usr/bin/gcc-4.2

参考: XCodeを4.5にバージョンアップした後に、gem(native extensions)のインストールで「You have to install development tools first.」と言われてしまった時の対処法

再度rails new

atomicの1.1.4も無事入ったので続きを。
と思ったんですが、rails newが途中でこけた場合、どうやって再開すれば良いんだろう??

とりあえずもう1回やってみました。 rails new ticket

既に作成されているファイルとかディレクトリは無視されますが、secret_token.rbだけ上書きするか訊いてきます。「Y」で上書き。 先ほどコケたbundle installの部分も無事完了できたようです。とりあえずこれで。

P8 ruby script/serverが通らない

そんなディレクトリ自体ない。 ticketディレクトリに移動して、rails serverで立ち上がりました。

P12 ruby script/generate scaffoldが通らない

先ほどと同様、そんなディレクトリはない。
ticketディレクトリで下記を実行。

rails generate scaffold ticket name:string seat_id_seq:string address:string price_paid:decimal email_address:string

P27 4つの.html.erbを編集

本に書かれている4つのファイルに加えて「_form.html.erb」も編集が必要。
逆に、「edit.html.erb」と「new.html.erb」は編集箇所がない。

P34 ruby script/generate migration

これも。
rails generate migration AddPhoneToTickets phone:string

P36 .html.erbファイルの編集

先ほどと同じく、「_form.html.erb」も編集する。editとnewは触らない。((多分、editとnewで共通して使うフォーム部分を切り出してるんだな。))

    <%= f.text_field :price_paid %>
  </div>
  <div class="field">
    <%= f.label :phone %><br>
    <%= f.text_field :phone %>
  </div>
  <div class="field">
    <%= f.label :email_address %><br>

div要素で囲われていたりして本と少し違うけど、他を参考に電話番号用のフィールドを追加するというのは同じ。

ここまで触って再度試してみると、エラーは出ないけどphoneフィールドへの変更が効かない。

コントローラーも変更

だいぶ手こずりました。
本に書かれているビュー周りのファイル以外にも、コントローラーも変更しないといけないようです。

このファイルの一番下あたり。

    def ticket_params
      #params.require(:ticket).permit(:name, :seat_id_seq, :address, :price_paid, :email_address)
      params.require(:ticket).permit(:name, :seat_id_seq, :address, :price_paid, :phone, :email_address)
    end

引数に:phoneも足してあげましょう。

.json.jbuilder は?

他に、

この2つのファイルにも同様にカラム名が書かれている部分があったのですが、ここにphoneを足しても足さなくても変化が無いように見えたので、とりあえず外しました。

後々困ることになったら、そのとき対応しましょう。