読者です 読者をやめる 読者になる 読者になる

RVM+Ruby 1.9.2+Rails 3.0.7+SandboxでTwitterもどきを作る

Mac OS X 10.6.6
RVM 1.2.8
Ruby 1.9.2
Rails 3.0.7
MySQL Sandbox 3.0.17
MySQL MySQL Community Server 5.5.10
Mac OS X ver. 10.6 (x86, 64-bit), Compressed TAR Archive

Ruby 1.9.2のインストール

$ rvm list known
# MRI Rubies
...
[ruby-]1.9.2-rc1
[ruby-]1.9.2-rc2
[ruby-]1.9.2[-p180]
[ruby-]1.9.2-head
ruby-head
...

RVMでインストールできる1.9系のRubyを確認します。

$ rvm install ruby-1.9.2-p180
$ rvm use ruby-1.9.2-p180

ruby-1.9.2-p180をインストールします。

$ gem list

*** LOCAL GEMS ***

bundler (1.0.13)
rake (0.8.7)

.rvm/gemsets/global.gemsにbundlerを含めているため、あらかじめbundlerもインストールされます。bundlerがインストールされていない場合は、

$ gem install bundler

でインストールします。

プロジェクトホームの作成

$ mkdir buzzbuzz
$ cd buzzbuzz

Rails3のインストール

$ bundle init
Writing new Gemfile to /Users/foo/dev/001.projects/buzzbuzz/Gemfile

カレントディレクトリにGemfileが作成されます。

FILE: $RAILS_ROOT/Gemfile

--- Gemfile	2011-05-07 00:00:01.000000000 +0900
+++ Gemfile	2011-05-07 00:00:20.000000000 +0900
@@ -2,3 +2,4 @@
 source "http://rubygems.org"
 
 # gem "rails"
+gem "rails", ">=3.0.0"

GemfileにRails3を追記して、

$ bundle install --path vendor/bundle
Fetching source index for http://rubygems.org/
...
Installing rails (3.0.7) 
Your bundle is complete! It was installed into ./vendor/bundle

Rails3をインストールします。

--pathオプションについて

$ bundle install

通常、bundle installを行うと、gemパッケージは$GEM_HOME以下、つまり

$ echo $GEM_HOME
/Users/tetsuyai/.rvm/gems/ruby-1.8.7-p334

にインストールされますが、これではシステムのgemパッケージと区別できなくなってしまいます。

$ bundle install --path vendor/bundle

プロジェクトのgemパッケージを$GEM_HOMEではなく、そのプロジェクト配下のディレクトリにインストールしたい場合、--pathオプションを指定します。これでgemパッケージはvendor/bundleディレクトリに展開されるため、$GEM_HOMEは汚染されません。

$ bundle install vendor/bundle

ちなみに"--path"は省略することができます。

$ cat .bundle/config 
--- 
BUNDLE_PATH: vendor/bundle
BUNDLE_DISABLE_SHARED_GEMS: "1"

ディレクトリを指定してbundle installすると、次回以降、なにも指定しなくてもそのディレクトリが使われます。最初に指定したディレクトリは、Bundlerが生成する$RAILS_ROOT/.bundler/configというファイルに書き出されています。


--disable-shared-gemsオプションについて

少し前の記事を読むと、--disable-shared-gemsオプションに関する記述を見かけることがあります。


以前は、$GEM_HOMEにすでにgemパッケージがインストールされている場合、Gemfileに同じgemパッケージを指定してもbundle installではインストールがスキップされて、$GEM_HOMEにインストールされたgemパッケージが使われる、というのがデフォルトの挙動でした。

$ bundle install  --path vendor/bundle --disable-shared-gems

--disable-shared-gemsオプションはデフォルトの挙動を変更し、$GEM_HOMEにインストールされたgemパッケージに関係なく、指定されたディレクトリにgemパッケージをインストールします。


しかし、v1.0からはデフォルトの挙動が--disable-shared-gemsオプションを指定した状態と同じになったようです。$RAILS_ROOT/.bundler/configを覗くと、BUNDLE_DISABLE_SHARED_GEMSのフラグが立っています。また、v0.9では公式サイトにあった--disable-shared-gemsオプションの記述(Bundler: The best way to manage a Ruby application's gems)が、v1.0からはなくなっていました。


したがって、ここでは--disable-shared-gemsオプションは指定せずにbundle installしています。

プロジェクトの作成

$ bundle exec rails new . -J -T -d mysql
       exist  
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
    conflict  Gemfile
Overwrite /Users/foo/dev/001.projects/buzzbuzz/Gemfile? (enter "h" for help) [Ynaqdh] Y
       force  Gemfile
      create  app
      ...

Rails3のプロジェクトを作成します。ここで指定したオプションの意味は以下の通りです。

-J --skip-prototype JQueryを使うので)prototype.jsを使わない
-T --skip-test-unit RSpecを使うので)TestUnitを使わない
-d mysql - データベースにはMySQLを使う

他にも以下のようなオプションが指定できます。

-O - ActiveRecordを使わない

この後、Gemfileを上書きしてもいいか尋ねられるので、上書きします。

データベースの作成

$ cd ~/sandboxes/msb_5_5_10/
$ ./start
$ ./use -uroot -pmsandbox

MySQLホスティングにはMySQL Sandboxを使います。今回は他のプロジェクトで使っていたMySQL 5.5を再利用します。

> CREATE DATABASE buzzbuzz_development DEFAULT CHARACTER SET utf8;
> GRANT ALL PRIVILEGES ON buzzbuzz_development.* to 'buzzbuzz'@'localhost' IDENTIFIED BY 'buzzbuzz' WITH GRANT OPTION;
> CREATE DATABASE buzzbuzz_test DEFAULT CHARACTER SET utf8;
> GRANT ALL PRIVILEGES ON buzzbuzz_test.* to 'buzzbuzz'@'localhost' IDENTIFIED BY 'buzzbuzz' WITH GRANT OPTION;

開発用のデータベースと、テスト用のデータベースを作成しました。

gemパッケージのインストール

FILE: $RAILS_ROOT/Gemfile

--- Gemfile	2011-05-07 01:48:11.000000000 +0900
+++ Gemfile	2011-05-07 01:56:04.000000000 +0900
@@ -8,24 +8,30 @@ gem 'rails', '3.0.7'
-gem 'mysql2'
+gem 'mysql2', '0.2.7'
 
 # Use unicorn as the web server
-# gem 'unicorn'
+gem 'unicorn'
 
 # Deploy with Capistrano
-# gem 'capistrano'
+gem 'capistrano'
+gem 'capistrano-ext'
+gem 'capistrano_colors'
 
 # To use debugger (ruby-debug for Ruby 1.8.7+, ruby-debug19 for Ruby 1.9.2+)
 # gem 'ruby-debug'
-# gem 'ruby-debug19', :require => 'ruby-debug'
+gem 'ruby-debug19', :require => 'ruby-debug'
 
 # Bundle the extra gems:
 # gem 'bj'
 # gem 'nokogiri'
 # gem 'sqlite3-ruby', :require => 'sqlite3'
 # gem 'aws-s3', :require => 'aws/s3'
+gem 'jquery-rails'
 
 # Bundle gems for the local environment. Make sure to
 # put test-only gems in this group so their generators
 # and rake tasks are available in development mode:
-# group :development, :test do
+group :development, :test do
 #   gem 'webrat'
-# end
+  gem 'rails3-generators'
+  gem 'rspec-rails', '>= 2.0.0'
+  gem 'factory_girl'
+end

Gemfileにgemパッケージを追記します。

$ bundle install

gemパッケージをインストールします。

RSpecJQueryのインストール

bundle exec rails g rspec:install
bundle exec rails g jquery:install

gはgenerateの略で、rails generateと書いても同じ意味になります。

$ bundle exec rails g
Usage: rails generate GENERATOR [args] [options]

General options:
  -h, [--help]     # Print generator's options and usage
  -p, [--pretend]  # Run but do not make any changes
  -f, [--force]    # Overwrite files that already exist
  -s, [--skip]     # Skip files that already exist
  -q, [--quiet]    # Suppress status output

Please choose a generator below.

Rails:
  controller
  generator
  helper
  integration_test
  mailer
  migration
  model
  observer
  performance_test
  plugin
  resource
  scaffold
  scaffold_controller
  session_migration
  stylesheets

Authlogic:
  authlogic:session

Jquery:
  jquery:install

Koala:
  koala:install

MongoMapper:
  mongo_mapper:install

Mustache:
  mustache:install

Rspec:
  rspec:install

引数を省略すると使い方が表示されます。Authlogic以降が表示されているのは、rails3-generatorsが組み込まれているためです。

ここでjQueryのインストール中にエラーが発生しました。『SSL error on jquery:install』で同じ話題が見つかりました。

$ bundle exec rails g jquery:install
      remove  public/javascripts/controls.js
      remove  public/javascripts/dragdrop.js
      remove  public/javascripts/effects.js
      remove  public/javascripts/prototype.js
    fetching  jQuery (1.6)
   identical  public/javascripts/jquery.js
   identical  public/javascripts/jquery.min.js
    fetching  jQuery UJS adapter (github HEAD)
/Users/tetsuyai/.rvm/rubies/ruby-1.9.2-p180/lib/ruby/1.9.1/net/http.rb:678:in `connect': SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B (OpenSSL::SSL::SSLError)

githubからjQuery UJS adapterをフェッチしようとしたところで失敗しています。rails.jsのコピーに失敗しているだけなので、githubrails / jquery-ujsにあるManual installationに従って、手動で$RAILS_ROOT/public/javascriptsディレクトリにrails.jsをコピーします。

FILE: $RAILS_ROOT/config/application.rb

--- config/application.rb	2011-05-08 14:49:29.000000000 +0900
+++ config/application.rb	2011-05-08 14:50:14.000000000 +0900
@@ -31,7 +31,7 @@ module Buzzbuzz
     # config.i18n.default_locale = :de
 
     # JavaScript files you want as :defaults (application.js is always included).
-    config.action_view.javascript_expansions[:defaults] = %w()
+    config.action_view.javascript_expansions[:defaults] = %w(jquery rails)
 
     # Configure the default encoding used in templates for Ruby 1.9.
     config.encoding = "utf-8"

それから、$RAILS_ROOT/config/application.rbに上の一行を書き加えておきましょう。