sakaikの日々雑感~日常編

sakaikの日々の雑記。食べ物、読み物、お出かけ(旅行)などなど

10日でおぼえるRuby on Rails で学ぶ Ruby on Rails メモ

 

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

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

 ということで少し前から 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 Railsaptana 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:\Aptana\Aptana Studio にした。XMLにも関連づけした。
    • インストール完了後、aptana studio のアイコンから起動。
    • workspaceとして C:\InstantRails17\rails_apps を指定。
    • [Help]-[Software Updates]-[Find and Install] ●Search for new features to install
    • RadRails にチェック(他にPHPとかAIRとかiPhoneとかあって楽しい)次画面でも同様にチェック。(証明書がない旨警告が出るが Install All)

第1日目:InstantRailsirbrubyの基礎

やったこと:


  • 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\ruby\dot.irbrc)。 そのファイル内に require 'irb/completion' と指定する。 これで Windows でも > irb と起動するだけでtab補完できるようになりました。(マイコンピュータから環境変数再設定した後は、InstantRailsの再起動が必要)

第2日目:Railsの開発体験

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


  • プロジェクトの作成
    • InstantRailsよりDOS窓を開く
      • C:\InstantRails17\rails_apps> の位置でコンソールが開いた
    • プロジェクトの作成 (rails コマンド)
      • 例: rails memopad > memopadディレクトリができた
    • cd memopad (中に入る)
    • 開発用サーバ(Mongrel)で新プロジェクトを試しに見てみる

  • 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 script\generate migration create_table を実行
      • db/migrate/の下に001_create_table.rbが作成された
    • この rbファイルの self.up ブロック内にテーブル定義情報記述
    • self.down に drop_table :テーブル名 を記述
    • rake db:migrate を実行 -> テーブルができた

  • scaffold の作成:
    • ruby script\generate scaffold [モデル名]
      • (モデル名は テーブル名の単数形をUpperCamelしたもの)
      • (今回は memos テーブルなので Memo)
    • 動作確認:サーバを起動(rails_apps\memopad>ruby script\server)して 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 に 期待する値の条件を書くだけ!

  • 年月日の月部分が 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/ にアクセス



    • その後 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 script\generate 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 script\generate model Attachment
  • テーブル定義: db\migrate\003_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\rails_apps\memopad>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\rails_apps\memopad>PATH=%PATH%;C:\InstantRails17\ruby\Ruby-GNO
ME2\lib\GTK\bin

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

C:\InstantRails17\rails_apps\memopad>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 テーブルに入らなくてかなり悩んだ。



(つづく)