10日でおぼえる Ruby on Rails入門教室

10日でおぼえる Ruby on Rails入門教室

  • 作者: arton
  • 出版社/メーカー: 翔泳社
  • 発売日: 2008/04/15
  • メディア: 大型本
  • 購入: 6人 クリック: 113回
  • この商品を含むブログ (41件) を見る

 ということで少し前から Ruby のお勉強、そして Ruby on Rails のお勉強を始めました。まだ「お」がついているのは、照れ隠しです。
 現在、主に使用しているのは arton さんの「10日でおぼえるRuby on Rails」(翔泳社)です。 「10日で」なんてついている本なんて適当に表面をなぞっただけの雑な作りをしたものが多い、という先入観が私の中にあったのですが、artonさんというお名前と(まだお会いしたことないのですが、いつかお会いする機会があるでしょうか)、高橋氏の「これ "arton さんが隣につきっきりで居てくれれば" 10日で終わるよ」と少し楽しげに話していた様子が強く印象に残ったことがありこの本を手にしました。
 実際に読んでみると、たしかに1日分が1日で終わらないです。1日というのが普通に丸一日ということだとしても、10日分以上の時間はすでに費やしていると思います。1ヶ月かかっても終わらないんじゃないかなぁ。


 ということで、この日記には「10日でおぼえるRuby on Rails」で学んでいった苦労とか、忘れたくないメモとかを書いていこうと思います。本日記の日付とは関係なく、後日適宜付け足しをしていく予定です。

第0日目:環境構築

 ゼロ日目なんてのがある時点ですでに「11日で学ぶ」じゃないか、とツッコみたくなりますが、この程度はさくっとやっておけという主張でしょう。普通「初日です、インストールして操作に慣れてみましょう」みたいなものだと思っていたので、これが「ゼロ日目」という設定に、いきなり背筋が伸びました。
Instant Rails と aptana studio & RadRails のインストール。それぞれ、以下のURLから各ファイルを取得してインストール。

  • http://rubyforge.org/frs/?group_id=904
    • InstantRails-1.7-win.zip 2007-03-25 01:52 59.21MB を。
    • アーカイブを展開して C:InstantRails17ディレクトリに。
  • http://www.aptana.com/rails から
    • Aptana Studio 1.2.1 を。
    • C:AptanaAptana Studio にした。XMLにも関連づけした。
    • インストール完了後、aptana studio のアイコンから起動。
    • workspaceとして C:InstantRails17 ails_apps を指定。
    • [Help]-[Software Updates]-[Find and Install] ●Search for new features to install
    • RadRails にチェック(他にPHPとかAIRとかiPhoneとかあって楽しい)次画面でも同様にチェック。(証明書がない旨警告が出るが Install All)

第1日目:InstantRailsとirbとrubyの基礎

やったこと:

  • InstantRails.exe起動確認:
    • パス変更のダイアログが出るので OK で。
    • 3306が既に使われているとメッセージ(MySQLは単独でインストール済みだったので)
      • そのMySQLを使ってもよかったのだが今回は InstantRails環境内でクローズしたかったため、ポートを変えて利用することにした。
    • [I]-[Configure]-[MySQL]で、port=3316を設定。
  • irb起動確認:
    • [I]-[RailsApplications]-[Open Ruby Console Window] (以降「Dos窓を開く」などと表現)
    • ruby -v とか irb 起動とかを確認。
    • irb -rirb/completion で tab補完可能になる
      • 追記:linux では ~/ に .irbrc というファイルを作成し、require irb/completion と書いておけば、これを読み込んでくれるのでいつでも(上記コマンドラインパラメタをつけなくても)補完可能になるそうです(コメントくださった通りすがりさんありがとうございます!)
      • 追記: windows では、環境変数 IRBRC に .irbrc のファイル名を指定しておいて(例:C:InstantRails17 ubydot.irbrc)。 そのファイル内に require irb/completion と指定する。 これで Windows でも > irb と起動するだけでtab補完できるようになりました。(マイコンピュータから環境変数再設定した後は、InstantRailsの再起動が必要)

第2日目:Railsの開発体験

 本を読んで順に「作業」した感が強く、まだ全体像が私の中で見えてきていないのですが、まずはつらつらとメモ。([あとでコマンドとか整理したい])

  • プロジェクトの作成
    • InstantRailsよりDOS窓を開く
      • C:InstantRails17 ails_apps> の位置でコンソールが開いた
    • プロジェクトの作成 (rails コマンド)
      • 例: rails memopad > memopadディレクトリができた
    • cd memopad (中に入る)
    • 開発用サーバ(Mongrel)で新プロジェクトを試しに見てみる
      • ruby scriptserver で Mongrel 起動
      • ブラウザで確認> http://localhost:3000/  >なんか見えた。OK。
  • Aptana(RadRails)へのプロジェクト読込
    • Aptanaを起動
    • 文字コードをUTF-8に設定:[Window]-[Preferences]#[General][Workspace] で OTHER の UTF-8に。
    • プロジェクトをインポート:[File]-[Import]#[other]-[ExistingFolderAsNewProject] で 先ほど作ったプロジェクトフォルダ(memopad)を指定
      • Ruby Explorer ビューなどでファイル一覧を確認できるようになった。
  • DBの設定: config/database.yaml に port: 3316 を追加した(↑のインストール時に変更してるので)
  • DBの作成: lib/tasks/ の下に、setup_db.rb を作成(今回はCDからコピー)(DB接続情報が書いてある)
    • 私の環境でRoR用のMySQLは 3316 ポートなので、 このファイルに , port => 3316 を追加。
  • TABLEの作成:
    • ruby scriptgenerate migration create_table を実行
      • db/migrate/の下に001_create_table.rbが作成された
    • この rbファイルの self.up ブロック内にテーブル定義情報記述
    • self.down に drop_table :テーブル名 を記述
    • rake db:migrate を実行 -> テーブルができた
  • scaffold の作成:
    • ruby scriptgenerate scaffold [モデル名]
      • (モデル名は テーブル名の単数形をUpperCamelしたもの)
      • (今回は memos テーブルなので Memo)
    • 動作確認:サーバを起動(rails_appsmemopad>ruby scriptserver)して http://localhost:3000/memos/new やlist, show/id, edit/id などを参照してみる
      • CRUD ができてる!
    • 各ファイル確認(Controller, Model, View)
      • View で <%= %> で囲んで処理記述。テキストを表示したいときは <%=h %> とするとエスケープ処理をしてくれる。
      • View でパーシャルrhtml(部品になるやつ)はファイル名が _ で始まる。


ちなみに、script/generater には(ビルトインとしては) 以下の機能(ジェネレータ)が指定可能

  • migration, scaffold, controller, model, mailer, observer, plugin, resource, scaffold_resource, session_migration, web_service, integration_test がある。

第3日目:validation とI18n

scaffold で生成されたファイル群をいろいろいじってみる日です。

  • 入力フォームでの内容チェック(validation)をつけるのは簡単!
  • validationの追加
    • models/memo.rb に 期待する値の条件を書くだけ!
      • 例: validates_presence_of :[カラム名], :[カラム名]で必須項目指定
      • 例: validates_length_of :[カラム名], :maximum => 8 で長さ指定
  • 年月日の月部分が Jan とか表示されてるのが気に入らないので数字にしたい
    • views/memos/_form.rhtml
      • <%= datetime_select memo, created_at %> の中に , :use_month_numbers => true を追加するだけ。
      • (ほんとに「知ってるか知らないか」だけの世界なんだなぁ。知っていれば確かにラクだけど、こういうプログラムからこの世界に入った人って楽しいと思うのかなぁ、とやはり思ってしまう)
  • MySQLを utf8化
    • my.iniに default-character-set=utf8 と skip-character-set-client-handshake を追加。(InstantRailsから [Config]-[MySQL]が便利)
    • DBの作りなおしには rake destroy_db 後 rake setup_db, rake db:migrate(データは破棄される。必要ならちゃんとダンプして入れ直す)
  • APIドキュメント(RDoc)の参照方法
    • RubyGemsでインストールした gem の持つ RDoc 形式のAPIドキュメントを参照できる。
    • gem_server.bat を起動して http://localhost:8808/ にアクセス
  • Ruby-GetTextをインストールしてみる
    • gem install gettext
    • Ruby-GNOME2 Win32 GUI InstallerのDLとインストール
      • http://sourceforge.net/project/showfiles.php?group_id=53614から -win32のもの(0.16)
  • 国際化
    • うまく日本語に変わってくれなくて大苦労。まずgettext のバージョンが新しすぎたのが原因のひとつらしい
    • gem uninstall gettext --version 1.93.0 で一旦アンインストール。
    • http://underrails.seesaa.net/article/101581219.html Rails開発日記 さんを参考に、gettext 1.90.0 を入れて、ソースも若干修正。
      • gem "gettext","<=1.90.0"
      • require "gettext/rails"
    • その後 mo ファイルを作ったあとも コントローラやモデルのもの(要するに今回はカラム名だけ)は日本語になったのにrhtml中の文字は英語のまま。
      • → list.rhtml なら list_ja.rhtml をつくってゴリゴリ直書きしたら、日本語にはなった。。この本でやりたかったこととはたぶん違うよなぁ。。
      • →試行錯誤したが解決の糸口がないので断念。当面の私の開発では rhtml にゴリゴリ日本語書いちゃえばいいな、と割り切り。

第4日目:テスト

  • rake RAILS_ENV=test setup_db
  • 初回テスト: rake => 8 tests, 0 assertions, 0 failures, 8 errors とエラーがまず出る
  • test/functional/memos_controller_test.rb を編集
    • @first_id = memos(:first).id が test/fixtures/memos.yml 内の指定と異なるので :one に変更
    • 再度 rake でテスト実行で ↓に変わった
      • 8 tests, 22 assertions, 4 failures, 0 errors
    • test/fixtures/memos.yml に サンプルデータを書き込み
    • なかなか 4 failures が減らなくて困っていたら、テスト用データとして書いた locationカラム値が 2文字だったのが敗因。
      • (前の課で色々試したときに 4-8文字の制限をつけたのだった。なのでここで failure になってくれてテストの妥当性が証明されたと言うことで^^;)
  • unitテスト
    • ruby scriptgenerate migration expand_location
      • => db/migrate/002_expand_location.rb ができた
    • 002_expand_location.rb を編集
    • rake db:migrate
      • => RAILS_ENV に従い memopad_development DB のみがマイグレートされた
    • test/unit/memo_test.rb を編集
    • rake test:units
      • app/models/memo.rb で 8文字制限をしていたため256文字でもエラーになっていたもの。
      • 同ファイルの validates_length_of の :maximum を 256 にして再テスト => OK
  • ファンクショナルテスト
    • test/functional/memos_controller_test.rb (最初のファイル)を編集
    • rake test:functionals

第5日目:ファイル格納への拡張

  • モデルの追加: ruby scriptgenerate model Attachment
  • テーブル定義: dbmigrate03_create_attachments.rb にカラム情報を追加
    • HOPE: とりあえず言われるままに記述したけど記述方法とかちゃんと整理しておきたい。というかこの記法私はなんか気持ち悪くて、CREATE TABLE 文を書いておきたいのだが。。。<いくつかのプログラムを見るとCREATE TABLE文で記述されているのもあるようで、その辺の作法等含めて整理しておきたい。
  • DBマイグレート: rake db:migrate
    • この指令により実際にDBに変更が反映される
  • unitTestの記述: test/unit/attachment_test.rb に記述
  • rake update_po
    • さて、ここでpot/po ファイルの再作成時にエラーが発生。大騒ぎ悩む悩む。これで数日つぶした。経緯と対応は以下のとおり。
C:InstantRails17
ails_appsmemopad>rake update_po
(in C:/InstantRails17/rails_apps/memopad)
po/memopad.pot
C:/InstantRails17/ruby/bin/rake.bat: No such file or directory - msgmerge po/mem
opad.pot tmp.pot
rake aborted!
You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.empty?

 なんか、rake.bat がないって言ってるんだけど、rake.batはあるんだな。いや意味が違う、rake.bat がないんじゃなくて、rake.bat で呼んでる msgmergeてのがないんですな。なるほど。どこ?どこ? ふむ こんなところに!! ということでパス追加しました。

C:InstantRails17
ails_appsmemopad>PATH=%PATH%;C:InstantRails17
ubyRuby-GNO
ME2libGTKin

 で、再度 rake update_po を実行してみる。

C:InstantRails17
ails_appsmemopad>rake update_po
(in C:/InstantRails17/rails_apps/memopad)
po/memopad.pot
... done.
po/ja/memopad.po
... done.

OKになった。めでたしめでたし。

もう一点、この日は、<% form_tag ({:action => create}, :multipart=>true) do %>
の multipart の指定を忘れて、データが attachments テーブルに入らなくてかなり悩んだ。



(つづく)