「はじめる! Rails3」で勉強中

達人出版会の「はじめる! Rails3」という電子書籍を購入してみました。読みながら例題アプリを作成していくという構成になっていて、Railsの仕組みを1から教えてくれるのでとてもわかりやすい。また、各章の終わりに演習問題がついていて、メインで作成していく例題アプリの他に、それまで習ったことを復習するような形で別線のアプリを作って行くというのが面白い。
http://tatsu-zine.com/books/rails3

この手法は結果的には似たようなアプリを2つ作ることになるんだけど、一方は本書に従ってサンプルソースをひたすら写して流れを掴んでいくのに対し、演習問題では課題だけ与えられて基本的には自分で考えてコードを組んで行く。最初はなるべく本書で習ったことは見ないようにして記憶を頼りにあれこれ書いてみることで、理解できていない部分がより明確になるので自分の理解度を確かめながら一歩ずつ進んで行けるのがいい。うまい作りだなぁ、と思った。
でも、せっかくだから自分なりにやりがいが持てるように一工夫入れてみている。それは演習問題の代わりに自分が興味ある内容に読み替えてアプリを作るというもの。本書だとメインが「タスクリスト」で演習問題が「書籍一覧」になっているが、僕は趣味のギターにちなんで「押尾コータロー曲&チューニング一覧」を後者で作ることにした。そうすることで完成した後にも自分用に使えそうだし、改造していってオリジナルのアプリにしていく楽しみもある。進捗度とか youtube連携とかもやってみたい。
現在ようやく 8章の終盤に差し掛かりデータの追加までいけた。続きが楽しみ。

作りかけのアプリを Heroku に上げてみた。
http://sharp-sunset-796.heroku.com/

git に登録して heroku にデプロイするまでのコマンド

$ git init
$ git add .
$ git commit
$ heroku create
$ git push heroku master
$ heroku rake db:migrate VERSION=0 #カラムを変更した場合など。始めからやり直したい
$ heroku rake db:migrate
$ heroku rake db:seed
$ heroku open

これまでの疑問備忘録

  • 8.2

form.date_select によって年月日を指定できるセレクトボックスを表示しているが、「年」だけを表示することは可能なのだろうか?

  • 8.3
<%= link_to "新規作成", [ :new , :task ] %>

ここの :task の意味がわからない‥。前にも出て来ている link_to の第2引数の意味自体があやしい。 :tasks task :task の違いがよくわかっていないんだろう。

2011/03/13 追記

herokuデプロイでハマる

部分テンプレートを適用した後に heroku にデプロイしたら new と edit の操作時にエラーになってしまうという現象でハマった。ローカルではきちんと動くのに heroku 上では上手く行かない。herokuサーバ上でのログを見てみようとしたが、「heroku logs」というコマンド打ってみても「This feature is not supported by your client version.」というメッセージが出るだけ。新しい環境ではこういう場合どうしていいのかわからないのが辛いところ。
結局解決したのだけど、単に部分テンプレートとして分割した _form.html.erb を git に登録しわすれていたというのが原因だった。ローカルで動くのに herokuでエラーになる場合はまず git への登録漏れを疑おう。

カラム追加でハマる

一度作成したモデルへカラムを追加する方法でどうやればよいのか悩んだ。既に存在する 「db/migrate/20110309094831_create_tunes.rb」に新たなカラムを書き込んで、「 rake db:migrate 」をしても追加されない。新たなマイグレーションファイルを追加する方法もどこかに書いてあったけど、そこまで大げさじゃないしなぁ。
結局以下の方法で、いちどDBを初期状態に戻してから再度 migrate することで変更を反映させることができた。

$ rake db:migrate VERSION=0
$ rake db:migrate

当然データも無くなってしまったので db/seeds.rb に追加分カラムのデータも書き込んで「rake db:seed」を実行する必要があった。DBの内容を維持したままカラムを追加する方法も調べておく必要があるなぁ。herokuへデプロイ後も同様の操作が必要なので注意。