Ruby 1.8.7 / Rails 2.3.5 の環境作成とRspec導入

Ruby 1.8.7 / Rails 2.3.5 の環境作成とRspec導入 - 山田備忘録

↑これの続き。今回はRuby1.8.7が入っている前提で、Rails2.3.5/RSpec1.3.1を入れていきます。

$ gem install rake -v 0.8.7
# 入ったらrailsを入れる。
$ gem install rails -v 2.3.5
$ rbenv rehash
$ rails -v
Rails 2.3.5

※古いRailsにはrake0.8.7を入れるといいらしい↓

Rails 2.*系で「rake/rdoctask is deprecated. Use rdoc/task instead (in RDoc 2.4.2+)」エラー | GENDOSU@NET

必要であればsqliteも入れる。

$ gem install sqlite3-ruby -v 1.2.5

ちなみにバージョン指定しないと、

/usr/bin/gcc -I. -I. -I/home/vagrant/.rbenv/versions/1.8.7-p374/lib/ruby/1.8/x86_64-linux -I. -DHAVE_SQLITE3_INITIALIZE -DHAVE_SQLITE3_BACKUP_INIT -DHAVE_SQLITE3_COLUMN_DATABASE_NAME -DHAVE_SQLITE3_ENABLE_LOAD_EXTENSION -DHAVE_SQLITE3_LOAD_EXTENSION -DHAVE_SQLITE3_OPEN_V2 -DHAVE_SQLITE3_PREPARE_V2 -DHAVE_TYPE_SQLITE3_INT64 -DHAVE_TYPE_SQLITE3_UINT64 -I/home/vagrant/.rbenv/versions/1.8.7-p374/include   -I/home/vagrant/.rbenv/versions/1.8.7-p374/include  -fPIC -g -O2     -c aggregator.c
In file included from ./aggregator.h:4:0,
             from aggregator.c:1:
./sqlite3_ruby.h:15:27: fatal error: ruby/encoding.h: No such file or directory
 #include <ruby/encoding.h>
                       ^
compilation terminated.
make: *** [aggregator.o] Error 1

とか言って激しく怒られる。

ここまででプロジェクトを新規作成できる。

$ rails sample_prj
# rails new sample_prjではない✗

/home/vagrant/.rbenv/versions/1.8.7-p374/lib/ruby/gems/1.8/gems/activesupport-2.3.5/lib/active_support/dependencies.rb:55: uninitialized constant ActiveSupport::Dependencies::Mutex (NameError)

とか言って怒られるときは、

$ gem update --system 1.5.3

してみる。 ある程度新しいRubygemsとある程度古いRailsではこういう怒られ方をするらしい。 Railsの方を上げるのが本来だと思うけども、今回は古いRails環境を作るのが目的なので、Rubygemsの方を下げちゃう。 詳しくは

ruby on rails - Uninitialized constant ActiveSupport::Dependencies::Mutex (NameError) - Stack Overflow

プロジェクトのディレクトリに移動して、rspecプラグインをインストール&準備。

$ script/plugin install git://github.com/dchelimsky/rspec.git -r 'refs/tags/1.2.9'
$ script/plugin install git://github.com/dchelimsky/rspec-rails.git -r 'refs/tags/1.2.9'
$ script/generate rspec

これで使用できました。

ところで、このバージョンのRSpecは↓みたいな古風な書き方をしないといけない。 間違ってもexpect(~~)みたいな今風な書き方をしてはいけない。

describe User do
  before(:each) do
    @invalid_attributes = {}
    @valid_attributes = {:name => 'hoge'}
  end

  it "should create a new instance given valid attributes" do
    User.create!(@valid_attributes)
  end

  it "should be invalid without name" do
    User.new(@invalid_attributes).valid?.should be false
  end
end

古いものを動かすには古いもので揃えてあげないといけないんだなーと思いました(低レベルな感想)。