Rails2.0リリース

というわけで、もたもたしている間にRails2.0(.2)が出てしまった。せっかくなので、これから先はRails2.0を勉強していきたい。
相変わらずJRubyを使う予定だけど、JRubyの方も1.0.3がリリースされているので、こちらも同じくアップデートしておく。ちなみに、古いRailsは1.0.3では動作しなくなったみたい。

JRuby: 1.0.3 addresses compatibility issues, 1.1 performance update

インストール方法はJRuby1.0.2+Rails1.2の時と変わらず、「gem install rails」でOK。
以降、JRuby で Ruby on Railsと同じ手順で進めながらbookmarkアプリを作ってみる。
C:\Projects\OtherProjects\Rails>jruby %RUBY_HOME%\bin\rails bookmar
create
create app/controllers
create app/helpers
create app/models
create app/views/layouts
create config/environments
create config/initializers
create db
create doc
create lib
create lib/tasks
create log
create public/images
create public/javascripts
create public/stylesheets
create script/performance
create script/process
create test/fixtures
create test/functional
create test/integration
create test/mocks/development
create test/mocks/test
create test/unit
create vendor
create vendor/plugins
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create Rakefile
create README
create app/controllers/application.rb
create app/helpers/application_helper.rb
create test/test_helper.rb
create config/database.yml
create config/routes.rb
create public/.htaccess
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/boot.rb
create config/environment.rb
create config/environments/production.rb
create config/environments/development.rb
create config/environments/test.rb
create script/about
create script/console
create script/destroy
create script/generate
create script/performance/benchmarker
create script/performance/profiler
create script/performance/request
create script/process/reaper
create script/process/spawner
create script/process/inspector
create script/runner
create script/server
create script/plugin
create public/dispatch.rb
create public/dispatch.cgi
create public/dispatch.fcgi
create public/404.html
create public/422.html
create public/500.html
create public/index.html
create public/favicon.ico
create public/robots.txt
create public/images/rails.png
create public/javascripts/prototype.js
create public/javascripts/effects.js
create public/javascripts/dragdrop.js
create public/javascripts/controls.js
create public/javascripts/application.js
create doc/README_FOR_APP
create log/server.log
create log/production.log
create log/development.log
create log/test.log
ぱっと見あんまり変わったところはなさそうで、とりあえず普通に生成はできている。ここからは、DBにテーブルを作らないといけないわけだけど…Rails2.0.2からデフォルトDBがSQLiteに変更されたらしい。せっかくだから使ってみたいけど、SQLiteの使い方なんて全然わからないぞ。ていうか、SQLite自体インストールされてないのでは…?というわけで、色々調べてみた。

SQLiteのインストールと動作確認
適当に検索してみたところ、SQLiteは別途インストールが必要で、Windows用のSQLiteはdllとして提供されている模様。さらに、sqlite.exeなるコマンドラインツールからDB操作できるようだ。

[Rails] RailsでSQLite♪
SQLite + ActiveRecordを試す
Imitation with Ruby on Rails

ということで、SQLiteの公式サイトから「sqlitedll-3_5_4.zip」と「sqlite-3_5_4.zip」をダウンロードして、展開。まずはデータベースエンジンである(はずの)sqlite3.dllを「C:\WINDOWS\system32」にコピーする。これで、少なくともオンメモリのDBとしては動作するようになったはず。
ただし、これだけではデータベースの操作ができない。データベースを操作するためには、sqlite3.exeを使う。とりあえずは、試しにsqlite3.exeを実行してみる。
SQLite version 3.5.4
Enter ".help" for instructions
sqlite> .database
seq name file

--- --------------- ----------------------------------------------------------

0 main

sqlite>
「.database」でデータベースの一覧が表示できる…らしいが、作ってないので当然1つも存在しない。が、動作はしている模様。

bookmarkアプリ用データベース&テーブル作成
動作確認が(たぶん)できたところで、bookmark用のデータベースを作成する。bookmarkアプリのDBの定義は、config\database.ymlにあるので、確認しておく。
# SQLite version 3.x
# gem install sqlite3-ruby (not necessary on OS X Leopard)
development:
adapter: sqlite3
database: db/development.sqlite3
timeout: 5000
この設定だと、db\development.sqlite3を作ればOKな模様。以下のコマンドで、DBファイルを指定してsqlite3.exeを起動する。
C:\Projects\OtherProjects\Rails\bookmark\db>sqlite3 development.sqlite3
SQLite version 3.5.4
Enter ".help" for instructions
sqlite> create table items(
...> id integer primary key,
...> url varchar(255),
...> title varchar(255),
...> description text
...> );
sqlite> insert into items(url,title,description)values('http://www.google.co.jp'
,'Google','Mos popular web search engine');
sqlite> select * from items;
1|http://www.google.co.jp|Google|Mos popular web search engine
sqlite> .exit

という感じで、bookmarkテーブルの作成完了を確認。あとは、MySQLの時と同じようにやれば動作するはずだ。

モデル/コントローラの作成
まずはモデルを作る。

C:\Projects\OtherProjects\Rails>cd bookmark

C:\Projects\OtherProjects\Rails\bookmark>jruby script\generate model item
exists app/models/
exists test/unit/
exists test/fixtures/
create app/models/item.rb
create test/unit/item_test.rb
create test/fixtures/items.yml
create db/migrate
create db/migrate/001_create_items.rb


続いてコントローラ。

C:\Projects\OtherProjects\Rails\bookmark>jruby script\generate controller item
exists app/controllers/
exists app/helpers/
create app/views/item
exists test/functional/
create app/controllers/item_controller.rb
create test/functional/item_controller_test.rb
create app/helpers/item_helper.rb
ItemControllerに「scaffold :item」を追加して、起動。
C:\Projects\OtherProjects\Rails\bookmark>jruby script\server
=> Booting WEBrick...
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-12-22 16:37:22] INFO WEBrick 1.3.1
[2007-12-22 16:37:22] INFO ruby 1.8.5 (2007-12-15) [java]
[2007-12-22 16:37:23] INFO WEBrick::HTTPServer#start: pid=1102920 port=3000

http://localhost:3000/item

にアクセスしてみると…

undefined method `scaffold' for ItemController:Class

なんと、エラー・・・。ActionControllerにscaffoldメソッドがなくなったのか??と思ったが、よく見るとこれはItemControllerのindexメソッド(?)で起きているらしい。scaffoldがなくても勝手に動くようになってる…?試しにscaffoldを削除すると、今度は違うエラーが。

MissingSourceFile in ItemController#index

no such file to load -- sqlite3
どうやら、database.ymlのsqlite3用アダプタがないから起きているらしい。sqlite3用アダプタをGemでインストールすれば解決か?
C:\Projects\OtherProjects\Rails\bookmark>gem install sqlite3-ruby
Select which gem to install for your platform (java)
1. sqlite3-ruby 1.2.1 (mswin32)
2. sqlite3-ruby 1.2.1 (ruby)
3. sqlite3-ruby 1.2.0 (mswin32)
4. sqlite3-ruby 1.2.0 (ruby)
5. sqlite3-ruby 1.1.0 (mswin32)
6. sqlite3-ruby 1.1.0 (ruby)
7. sqlite3-ruby 1.0.1 (mswin32)
8. sqlite3-ruby 1.0.1 (ruby)
9. Skip this gem
10. Cancel installation
> 1
Successfully installed sqlite3-ruby-1.2.1-mswin32
Installing ri documentation for sqlite3-ruby-1.2.1-mswin32...
Installing RDoc documentation for sqlite3-ruby-1.2.1-mswin32...
で、もう一度ItemControllerにアクセスしてみると…

SyntaxError in ItemController#index

C:/ProgramFiles/Java/JRuby/jruby-1.0.3/lib/ruby/gems/1.8/gems/sqlite3-ruby-1.2.1-mswin32/lib/sqlite3_api.so:0: Invalid char `\220' in expression
どうも、動かないらしい。実行環境をRubyに変更すると動くようになったため、JRubyの問題のようだが、いまいちよくわからない。原因究明については、別途エントリでやる予定。

以前までのエントリで、RubyプログラムやRailsの開発方法についてならJRubyとRubyでほぼ違いがないことがわかった。Rails2.0でデフォルトDBがSQLite3になったことに加え、AirやGoogle Gearsでの採用などSQLiteへの注目が高まっている。なので、多少趣旨を変更することになるかもしれないが、ここから先はJRuby+MySQLではなくRuby+SQLite3で進めていきたい。

追記:
このエントリでのRailsの動作のさせ方は、2.0での正式なやり方ではありません。詳しくは、以下の関連リンクのRails2.0のscaffoldは前とだいぶ違うらしいとかRails2.0でブックマークアプリとか見てください。

関連リンク
Rails2.0のscaffoldは前とだいぶ違うらしい

Migration
Rails2.0でブックマークアプリ
Rails2.0の変更点
Action Pack: Resources
Action Pack: Multiview
Action Pack: Record identification

コメント