ブログトップ 記事一覧 ログイン 無料ブログ開設

@sugamasao.blog.title # => ”コードで世界を変えたい” このページをアンテナに追加 RSSフィード Twitter

1970 | 01 | 02 | 03 |
2004 | 11 | 12 |
2005 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2006 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |

2008-12-28

[]WindowsRuby on Rails 2.2 + MySQL 5.x 環境を構築する手順とハマり所

始めに

Windows 環境で Rails 2.2 を使える環境を作ろうとしたところ、MySQL5.1 を使用するとライブラリ関係で正しく動作しないという事象が発生したので、ゼロから環境を構築する手順と合わせてハマり所を記載しておく。

ちなみに、Rails 2.2 であることが原因では無い(ハズ)なので、勘違いしないよう、ご注意ください。

Ruby 環境のインストール

Ruby 本体のインストール

上記から Ruby 1.8.7 の mswin 版 zip を取得する。

  1. 適当解凍する(必要があれば適当なディレクトリへ移動しておく)
  2. PATH を通す

今回は C:\ 直下に ruby フォルダを作成しておく事にした。追加するPATHは C:\Ruby\bin となる。

さて、PATHが通っているか確認してみよう。

C:\>ruby -v

ruby 1.8.7 (2008-08-11 patchlevel 72) [i386-mswin32]

大丈夫なようだ。

RubyGems のインストール

上記から 1.3.1 の zip ファイルを取得する。

展開したら setup.rb を実行する。

C:\rubygems-1.3.1>ruby setup.rb

成功したら gemバージョンを確認してみる

C:\rubygems-1.3.1>gem -v

1.3.1

おお、インストールされたっぽい。

不足する DLL を追加する

ここから以下を取得する。 readline は今回は不要だけど、irb を使用するときに必要になるので今のうちに取得しておく。

  1. http://jarp.does.notwork.org/win32/openssl-0.9.8d-2-mswin32.zip
  2. http://jarp.does.notwork.org/win32/zlib-1.1.4-1-mswin32.zip
  3. http://jarp.does.notwork.org/win32/readline-4.3-2-mswin32.zip

これらをDLしたら展開したそれぞれのフォルダの bin フォルダにある dll ファイルを、 Ruby の bin フォルダ(今回の場合は c:\ruby\bin)へコピーする*1

ここまでできたら基本的な Ruby 環境の構築は完了。

iconv のインストール

このままだと iconv ライブラリが Windows 自体にインストールされていないので、 Rails を構築したりするとエラーになるのでインストールする。

f:id:seiunsky:20081229020143p:image

ここの「iconv package with simple installation instructions」となっているリンクから zip をDLし、 README にある通りに so と dll をコピーする。

自分の環境では iconv.so は既にあったので下記の二つのファイルを Ruby の bin フォルダ コピーしておく*2

  1. charset.dll
  2. iconv.dll

Rails 環境のインストール

gem でインストールする。

C:\rubygems-1.3.1>gem install rails

Successfully installed rake-0.8.3

:

Installing RDoc documentation for activeresource-2.2.2...

できたっぽい。

C:\rubygems-1.3.1>rails -v

Rails 2.2.2

ちゃんとインストールされたようだ。

サンプルプロジェクトを作る

DB はまだだけど、一旦 Rails が正しく動作するかの検証を含めて rails コマンドで雛形を作ってみる。

今回は C:\rails_test フォルダを作成し、その中で sample プロジェクトを生成する

C:\rails_test>rails -d mysql sample

:

正しくできたようだ。

試しにサーバを起動してみる。

C:\rails_test>cd sample

C:\rails_test\sample>ruby script\server

=> Booting WEBrick...

=> Rails 2.2.2 application started on http://0.0.0.0:3000

=> Ctrl-C to shutdown server; call with --help for options

[2008-12-25 03:08:58] INFO WEBrick 1.3.1

[2008-12-25 03:08:58] INFO ruby 1.8.7 (2008-08-11) [i386-mswin32]

[2008-12-25 03:08:59] INFO WEBrick::HTTPServer#start: pid=3388 port=3000

ちゃんと起動した。

f:id:seiunsky:20081229020423p:image

MySQL ドライバのインストール

ちょっと忘れていたのだけど、今のところ MySQL へ接続するためのドライバをインストールしていなかった。

gem でインストールすれば良いので特に困ることは無いはず(エラーが出るけど、ドキュメント生成の部分なので放置)。

C:\rails_test\sample>gem install mysql

Successfully installed mysql-2.7.3-x86-mswin32

1 gem installed

Installing ri documentation for mysql-2.7.3-x86-mswin32...

Installing RDoc documentation for mysql-2.7.3-x86-mswin32...

ERROR: While generating documentation for mysql-2.7.3-x86-mswin32

... MESSAGE: Unhandled special: Special: type=17, text=""

... RDOC args: --op c:/ruby/lib/ruby/gems/1.8/doc/mysql-2.7.3-x86-mswin32/rdoc --exclude ext --main README --quiet ext README docs/README.html

(continuing with the rest of the installation)

MySQL5.0 のインストール

このエントリの冒頭で書いたとおり、 現在の Windows 環境では MySQL 5.1 は地雷なので、5.0 を入れる。

今回は下記のバージョンを使用した。

ちなみに、リンクの画面の下のほうにある

≫ No thanks, just take me to the downloads!

っていうリンクをクリックするとアカウントを登録しないでも DL ができるよ*3

dll が無いよ云々のエラーを見たくない人は、インストールするときに MySQL のパス環境変数に追加するチェックを入れておくと良いです。

f:id:seiunsky:20081229020956p:image

ちなみに 5.1 を入れちゃった場合

MySQL 5.1 がインストールされている状態で rails を動かすとこんな感じのエラーになってしまう。

db:migrate で以下のようなエラーになる。

C:\rails_test\sample>rake db:migrate

(in C:/rails_test/sample)

rake aborted!

undefined method `each' for #<Mysql:0x488b61c>

(See full trace by running task with --trace)

--trace を付けるとこんな感じ。

C:\rails_test\sample>rake db:migrate --trace

(in C:/rails_test/sample)

** Invoke db:migrate (first_time)

** Invoke environment (first_time)

** Execute environment

** Execute db:migrate

== CreateUsers: migrating ====================================================

-- create_table(:users)

-> 0.0940s

== CreateUsers: migrated (0.0940s) ===========================================

** Invoke db:schema:dump (first_time)

** Invoke environment

** Execute db:schema:dump

rake aborted!

Mysql::Error: Commands out of sync; you can't run this command now: SHOW TABLES

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/abstract_adapter.rb:188:in `log'

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:309:in `execute'

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/connection_adapters/mysql_adapter.rb:414:in `tables'

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/schema_dumper.rb:61:in `tables'

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/schema_dumper.rb:23:in `dump'

c:/ruby/lib/ruby/gems/1.8/gems/activerecord-2.2.2/lib/active_record/schema_dumper.rb:17:in `dump'

c:/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/databases.rake:246

c:/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/databases.rake:245:in `open'

c:/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/databases.rake:245

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:617:in `call'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:617:in `execute'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:612:in `each'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:612:in `execute'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:578:in `invoke_with_call_chain'

c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:571:in `invoke_with_call_chain'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:564:in `invoke'

c:/ruby/lib/ruby/gems/1.8/gems/rails-2.2.2/lib/tasks/databases.rake:112

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:617:in `call'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:617:in `execute'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:612:in `each'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:612:in `execute'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:578:in `invoke_with_call_chain'

c:/ruby/lib/ruby/1.8/monitor.rb:242:in `synchronize'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:571:in `invoke_with_call_chain'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:564:in `invoke'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:2019:in `invoke_task'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1997:in `top_level'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1997:in `each'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1997:in `top_level'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:2036:in `standard_exception_handling'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1991:in `top_level'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1970:in `run'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:2036:in `standard_exception_handling'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/lib/rake.rb:1967:in `run'

c:/ruby/lib/ruby/gems/1.8/gems/rake-0.8.3/bin/rake:31

c:/ruby/bin/rake:19:in `load'

c:/ruby/bin/rake:19

一見、ちゃんとテーブルは作成されているので、なんとなく動かせるじゃん? とか思うのだけど、適当なデータを追加してから(要するに select で 0 件以上のデータの場合に)画面へ表示させようとすると、以下のようなエラーになってしまう。

どうも select 時のカラムを取り出すところでおかしくなっている模様。

f:id:seiunsky:20081229020754p:image

一応、検索に引っかかるようにエラーの文章も書いておく。

ArgumentError in UsersController#show

NULL pointer given

RAILS_ROOT: C:/rails_test/sample

Application Trace | Framework Trace | Full Trace

(eval):3:in `each_hash'

(eval):3:in `all_hashes'

app/controllers/users_controller.rb:16:in `show'

Request

Parameters:

{"id"=>"1"}

Show session dump

Response

Headers:

{"Content-Type"=>"",

"cookie"=>[],

"Cache-Control"=>"no-cache"}

Linux 環境等なら、 gem でインストールした MySQL のドライバをソースからコンパイルする等して新しいバージョン(最新だと 2.8 が出ている)をインストールすれば使えるようになるかもしれない。

ただ、Winodws 環境だとそもそものコンパイル環境を構築するのがちょっとした障壁になるので、5.1に過剰な思い入れのある人意外は大人しく 5.0 系を使うようにすると良いと思います。

i18n 対応scaffold するよー

さあ、これでようやく Rails を使う環境にたどり着いた。

ここからはお約束の scaffold なのだけど、 Rails 2.2 からは 国際化対応(i18n)とやらがされているので、i18n対応の scaffold でサンプルアプリケーションを作ってみるよ。

参考サイト:no title

i18n 用 scaffold を使えるようにする

手順は上記のサイトにある通り、 gem に githubリポジトリを追加してから、ライブラリをインストールすれば良い

C:\rails_test\sample>gem so -a http://gems.github.com

http://gems.github.com added to sources

C:\rails_test\sample>gem i amatsuda-i18n_generators

Successfully installed gettext-1.93.0

Successfully installed amatsuda-i18n_generators-0.4.0

2 gems installed

Installing ri documentation for gettext-1.93.0...

Installing RDoc documentation for gettext-1.93.0...

これで、 scaffold が i18n 用のテンプレートをジェネレートしてくれるようになる。

i18n 対応 scaffold でアプリを作る

ようやくここまで来た。長い。長すぎる。。。大体、MySQL5.1を使ってハマっちゃったよーあはは、という話を書きたかっただけなのに、随分と話が膨らんだよ\(^o^)/

というわけで、 i18n 用 scaffold こと、 i18n_scaffold を実行する(普段は scaffold ってタイプする所が変わってる)

i18n_scaffold を実行

C:\rails_test\sample>ruby script\generate i18n_scaffold user name:string age:integer comment:text

exists app/models/

exists app/controllers/

exists app/helpers/

create app/views/users

exists app/views/layouts/

exists test/functional/

exists test/unit/

exists public/stylesheets/

create app/views/users/index.html.erb

create app/views/users/show.html.erb

create app/views/users/new.html.erb

create app/views/users/edit.html.erb

create app/views/layouts/users.html.erb

create public/stylesheets/scaffold.css

create app/controllers/users_controller.rb

create test/functional/users_controller_test.rb

create app/helpers/users_helper.rb

route map.resources :users

dependency model

exists app/models/

exists test/unit/

exists test/fixtures/

create app/models/user.rb

create test/unit/user_test.rb

create test/fixtures/users.yml

create db/migrate

create db/migrate/20081228150911_create_users.rb

無事に作成されたもよう。このまま、DBのマイグレを行う

DBテーブル作成

DBの定義を作る前に、 config/database.yml を確認して、ユーザ名やパスワードを変更しておいてから、下記を実行する。

今回はスキーマが無いのでスキーマの作成*4も実行しているよ。

C:\rails_test\sample>rake db:create

(in C:/rails_test/sample)

これでスキーマは作成された。

今度は migrate でテーブルを作成する。

C:\rails_test\sample>rake db:migrate

(in C:/rails_test/sample)

== CreateUsers: migrating ====================================================

-- create_table(:users)

-> 0.0630s

== CreateUsers: migrated (0.0780s) ===========================================

ここで一旦動作確認

まだ i18n の国際化には触れていないものの、これで普通に動作する雛形は作られたので一旦、確認してみる。

C:\rails_test\sample>ruby script\server

=> Booting WEBrick...

=> Rails 2.2.2 application started on http://0.0.0.0:3000

=> Ctrl-C to shutdown server; call with --help for options

[2008-12-29 00:39:52] INFO WEBrick 1.3.1

[2008-12-29 00:39:52] INFO ruby 1.8.7 (2008-08-11) [i386-mswin32]

[2008-12-29 00:39:52] INFO WEBrick::HTTPServer#start: pid=3716 port=3000

サーバーを起動させたら、 http://localhost:3000/usersアクセスしてみる。

f:id:seiunsky:20081229021446p:image

無事にアクセスできた。一件、データを追加してみる。

f:id:seiunsky:20081229021520p:image

おお、無事に追加することもできた!

国際化してみる

generate i18n で日本語リソースファイルの雛形を作成する。

C:\rails_test\sample>ruby script/generate i18n ja

exists config/locales

update config/environment.rb

create config/locales/ja.yml

debug 1 models found.

debug 19 translation keys found in views.

debug translating activerecord.models.user ...

debug translating activerecord.attributes.user.name ...

debug translating activerecord.attributes.user.age ...

debug translating activerecord.attributes.user.comment ...

debug translating activerecord.attributes.user.created_at ...

debug translating activerecord.attributes.user.updated_at ...

debug translating railties.scaffold.editing ...

debug translating railties.scaffold.show ...

debug translating railties.scaffold.back ...

debug translating railties.scaffold.new ...

debug translating railties.scaffold.listing ...

debug translating railties.scaffold.edit ...

debug took 0.796 secs to translate.

create config/locales/translation_ja.yml

注意

数日前に実行した時はこのままで国際化ができたのだけど、今日試したところ、上記で生成される config/locales/ja.yml がどう見てもオカシイです。本当にありがとうございました

ja.yml を ja.html にして表示したらこんなのですよ。どう見てもリソースファイルではございません。

f:id:seiunsky:20081229021958p:image

なので、ja.yml は en.yml をコピーして en: を ja: に修正することでお茶を濁しておく。。。

※amatsuda-i18n_generators-0.4.0 のソースを見た感じ、 github からファイルのテンプレートをダウンロードしてきて、それをファイルに吐いているようだけど、その参照先ファイルが移動しているために起こっているっぽい。

ちょっと突っかかったけれど、これで再度、サーバを立ち上げてみよう

f:id:seiunsky:20081229022053p:image

おおお、日本語化されている!

自分好みに日本語化してみる

単語があまりに直訳なので、自分で修正してみる。

config/locales/translation_ja.yml の日本語部分を修正してみる。ついでに、Destroy が日本語化されていないので、これも追加してみる。

ja: 
  activerecord: 
    models: 
      user: "ユーザ"
    attributes: 
      user: 
        name: "名前"
        age: "年齢"
        comment: "意気込みをどうぞ!" # 修正
        created_at: "に作られた"
        updated_at: "で更新"
  railties: 
    scaffold: 
      editing: "編集"
      show: "閲覧" # 修正
      back: "戻る"
      listing: "一覧"
      new: "新規作成" # 修正
      edit: "編集"
      destroy: "削除" # 追加

これで、また rails の画面を見てみよう。

f:id:seiunsky:20081229022243p:image

おおぉ! 変更されている!

ちなみに、ここのマッピングview を見てみるとわかると思うけれど、 translate メソッドの一番目の引数が該当する模様。

ついでに

国際化ということで、今はデフォルトが日本語だけど、英語版に切り替えるテストを行ってみる。

これは config/environment.rb の(おれの環境だと)51行目の default_locale で指定している。今は下記のように記載されているので

config.i18n.default_locale = 'ja'

これを

config.i18n.default_locale = 'en'

こうして、再度 http://localhost:3000/users にアクセスしてみる。

f:id:seiunsky:20081229022552p:image

おお、瞬く間に英語版に!!!!

まとめ

  • 自分でライブラリをコンパイルする気合が無ければ MySQL5.0 系を使え
  • 今はconfig/locales/ja.ymlがおかしくなので en.yml をコピペして ja: に変えておけ
  • いままで書くの忘れてたけど、libmySQL.dllが見つからないみたいなエラーが出てるやつは MySQL に PATH が通って無い。PATH を通すか、 PATH が通っているところにコピーしろ

*1:基本的にはPATHが通っている場所ならどこでも良いみたい

*2サイトによっては c:\windows\system32 にコピーしろと書いてあるけれど、これも PATH が通っていれば場所はどこでも良いので、 Ruby で必要なものは Ruby 内に固めておくことにする

*3:おれは長い間気が付かなかった…

*4:db:create

きくきく 2009/05/20 20:45 Mysql5.1とrubyの相性問題、私もはまりました・・・
結局、アドバイスどおりMysql5.0をインストールしたところ無事に動くようになりました。でもって、実験的にMySQL5.0のbinの下にあるlibmysql.dllを/bin/ruby.exeと同じパスにおいたところ、Mysql5.1サーバとも問題なくつながるようになりました。

ご参考までに。

seiunskyseiunsky 2009/05/22 01:09 なるほど、libmysql.dllを移植すると動くんですねw
ただ、よくわかってないですけど、5.0のバージョンを使ってどこまで無事に動くのかナゾですね。もしかしたら 5.1 で追加された機能等を呼び出すと死ぬとかあるかもですね。。。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証