“Ruby on Rails” with Windows7

Railsを使ってみました。

<僕が使っている環境>
ruby 2.0.0p247 (64bit)
DevKit-mingw64-64-4.7.2-20130224-1432-sfx (64bit)
rails 3.2.14
Windows7 (64bit)


(1)はじめに
はじめ、Rails 4.0を使ってみようと思ったんですが、エラーが出てうまくいきませんでした。atomicというライブラリがインストールできなくて、ストップしてる。

>gem install rails -v 4.0.0
Temporarily enhancing PATH to include DevKit...
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    C:/work_Apps/Ruby200-x64/bin/ruby.exe extconf.rb
creating Makefile

make "DESTDIR="
generating atomic_reference-x64-mingw32.def
compiling atomic_reference.c
atomic_reference.c: In function 'ir_compare_and_set':
atomic_reference.c:75:2: error: #error No CAS operation available for this platform
make: *** [atomic_reference.o] Error 1

Gem files will remain installed in C:/work_Apps/Ruby200-x64/lib/ruby/gems/2.0.0/gems/atomic-1.1.14 for inspection.
Results logged to C:/work_Apps/Ruby200-x64/lib/ruby/gems/2.0.0/gems/atomic-1.1.14/ext/gem_make.out

いろいろ調べてみたけど、Win7(64bit)がダメというわけでは無さそう。

gemのバージョンが2.0.3以上でないとダメという情報を見つけたけど、僕の環境ではgem2.0.3になっていたので、大丈夫なはず。

ためしにRuby(32bit)でRailsインストールしてみたけど、同じエラーがでる。
しかたなく、Rails3.xxにしてみたら、インストールできました。

というわけで、今回はRails4.xxをあきらめて、Rails3.xxをつかうことにしました。


(2)Ruby、DevKitダウンロード
Rubyのホームページに行きます
オブジェクト指向スクリプト言語 Ruby

「ダウンロード」の「Windows版Rubyバイナリ」から、
One-Click Ruby Installer for Windows を選びます。
ruby01

RubyInstaller for Windows のページでDownloadをクリック。

今回は、Installer版を使わずに、Archives版を使います。なぜかというと、今後、異なるバージョンのRubyを使う可能性があるため、システム環境変数をいじられたくないから。
DevKitも必要になるため、ダウンロードしておきます。

ファイル名:
ruby-2.0.0-p247-x64-mingw32.7z
DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe
ruby02


(3)Ruby、DevKitインストール
まずRubyインストールします。と言っても、ファイルruby-2.0.0-p247-x64-mingw32.7z を展開し、任意の場所に配置するだけです。

(参考)7z圧縮ファイルの解凍は、僕の場合7-Zip File Managerを使っています。
7-Zip

さて、Rubyインストール先として僕の場合、
C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32
としました。

Rubyの動作確認します。コマンドプロンプトでPath設定してから、バージョン確認してみます。gemのバージョン確認もしておきます。

>set path="C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32\bin";%path%

>
>ruby -v
ruby 2.0.0p247 (2013-06-27) [x64-mingw32]

>gem -v
2.0.3

次にDevKitをインストールします。(これがないと、Railsのインストール時にエラーで止まります。)
exeファイルを実行すると、カレントディレクトリに多くのファイルが展開されます。そのため、僕の場合、以下のフォルダを先に作成してそこに展開することにしました。
C:\work_Apps\Ruby\DevKit-mingw64-64-4.7.2-20130224-1432-sfx

そのうえで、DevKit-mingw64-64-4.7.2-20130224-1432-sfx.exe を実行します。ファイルの展開がすんだら、exeファイルは不要になるので、削除しておきます。

次に、DevKitの「dk.rb initを実行」します。すると、DevKitのフォルダにconfig.ymlが作成されます。

>cd C:\work_Apps\Ruby\DevKit-mingw64-64-4.7.2-20130224-1432-sfx

C:\~(省略)~ >ruby dk.rb init

Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

次に、config.ymlに、Rubyのパスを設定します。

  : (中略) :

# Example:
#
# ---
# - C:/ruby19trunk
# - C:/ruby192dev
#
---
- C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32

次に、「dk.rb install」を実行します。

>cd C:\work_Apps\Ruby\DevKit-mingw64-64-4.7.2-20130224-1432-sfx

C:\~(省略)~ >ruby dk.rb install

[INFO] Updating convenience notice gem override for 'C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32'
[INFO] Installing 'C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32/lib/ruby/site_ruby/devkit.rb'

これで、DevKitインストールが環境です。

DevKitを展開したフォルダ(C:\work_Apps\Ruby\DevKit-mingw64-64-4.7.2-20130224-1432-sfx)は、削除してしまっていいのかもしれないけど、よくわからないので、とりあえずそのまま残しています。


(4)Railsインストール
現時点での最新版をバージョン指定して、インストールすることにします。29個のgemがインストールされました。gem list でrailsのバージョンを確認しておきます。

>gem install rails -v 3.2.14
: (中略) :
Installing ri documentation for bundler-1.3.5
Parsing documentation for rails-3.2.14
Installing ri documentation for rails-3.2.14
29 gems installed

>gem list

*** LOCAL GEMS ***

actionmailer (3.2.14)
actionpack (3.2.14)
: (中略) :
rails (3.2.14)
railties (3.2.14)
rake (0.9.6)
rdoc (4.0.0, 3.12.2)
sprockets (2.2.2)
test-unit (2.0.0.0)
: (中略) :

これでRailsインストール完了しました。


(5)Railsアプリ起動
Rails動作確認のため、簡単なアプリを起動してみます。Rails動作確認が目的なので、DBは内蔵されているsqliteを使う設定のままにしておきます。

まず、アプリ作成用の適当な場所を決めます。
僕の場合、Rails_Appsというフォルダを作成して、その中にRailsアプリを置くことにしました。
C:\work_Apps\Ruby\Rails_Apps

次に、Railsアプリ作成ディレクトリに移動して、アプリ作成します。(僕の場合、システム環境設定でPath設定していないので、コマンドでPath設定追加しています)

>set path="C:\work_Apps\Ruby\ruby-2.0.0-p247-x64-mingw32\bin";%path%
>cd C:\work_Apps\Ruby\Rails_Apps
C:\work_Apps\Ruby\Rails_Apps>rails new test01
      create
      create  README.rdoc
      create  Rakefile
      create  config.ru
      create  .gitignore
     : (中略) :
Installing sass-rails (3.2.6)
Installing uglifier (2.2.1)
Your bundle is complete!
Use `bundle show [gemname]` to see where a bundled gem is installed.

アプリ起動してみます。アプリのディレクトリに移動して、起動コマンドを実行します。

>cd test01

C:\work_Apps\Ruby\Rails_Apps\test01>rails server
=> Booting WEBrick
=> Rails 3.2.14 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-09-24 02:52:54] INFO  WEBrick 1.3.1
[2013-09-24 02:52:54] INFO  ruby 2.0.0 (2013-06-27) [x64-mingw32]
[2013-09-24 02:52:54] INFO  WEBrick::HTTPServer#start: pid=9140 port=3000
[2013-09-24 02:53:24] ERROR LoadError: Please install the sqlite3 adapter: `gem install activerecord-sqlite3-adapter` (sqlite3 is not part of the bundle. Add it to Gemfile.)
        C:/work_Apps/Ruby/ruby-2.0.0-p247-x64-mingw32/lib/ruby/gems/2.0.0/gems/bundler-1.3.5/lib/bundler/rubygems_integration.rb:214:in `block in replace_gem'
        C:/work_Apps/Ruby/ruby-2.0.0-p247-x64-mingw32/lib/ruby/gems/2.0.0/gems/activerecord-3.2.14/lib/active_record/connection_adapters/sqlite3_adapter.rb:3:in `'
     : (中略) :

なんかエラーが出ました。sqlite3が使えないというエラーです。
とりあえずアプリ起動はできていますが、DBへのアクセスができない、という状態です。
ruby03

このエラーの原因としては、どうもバグっぽい。Windows上でRuby(64Bit)を使っているときにおこる?みたい。
解決法としては、以下2つを行います。
・Gemfile.lockの修正
・sqlite3のインストール
(参考)Ruby 2.0.0 – Rails 4.0 に SQLite3 をインストールしたときのメモ [Windows] | superable

まず、アプリのディレクトリ内にあるGemfile.lockを修正します。
C:\work_Apps\Ruby\Rails_Apps\test01\Gemfile.lock

sqlite3 (1.3.8-x86-mingw32) をx64に修正します

  : (中略) :

      multi_json (~> 1.0)
      rack (~> 1.0)
      tilt (~> 1.1, != 1.3.0)
    sqlite3 (1.3.8-x64-mingw32)
    thor (0.18.1)
    tilt (1.4.1)
    treetop (1.4.15)

  : (中略) :

この時点で、Railsアプリ起動しようとしても、sqlite3が無いってエラーが出ます。gem listで確認すると確かにsqlite3がインストールされていませんでした。そのため、sqlite3を手動インストールしました。

C:\work_Apps\Ruby\Rails_Apps\test01>rails server
Could not find sqlite3-1.3.8-x64-mingw32 in any of the sources
Run `bundle install` to install missing gems.

C:\work_Apps\Ruby\Rails_Apps\test01>gem list sqlite3

*** LOCAL GEMS ***

C:\work_Apps\Ruby\Rails_Apps\test01>gem install sqlite3
Fetching: sqlite3-1.3.8-x64-mingw32.gem (100%)
Successfully installed sqlite3-1.3.8-x64-mingw32
Parsing documentation for sqlite3-1.3.8-x64-mingw32
unable to convert "\x90" from ASCII-8BIT to UTF-8 for lib/sqlite3/2.0/sqlite3_native.so, skipping
Installing ri documentation for sqlite3-1.3.8-x64-mingw32
1 gem installed

C:\work_Apps\Ruby\Rails_Apps\test01>gem list sqlite3

*** LOCAL GEMS ***

sqlite3 (1.3.8 x64-mingw32)

あらためて、Railsアプリ起動してみます。

C:\work_Apps\Ruby\Rails_Apps\test01>rails server
=> Booting WEBrick
=> Rails 3.2.14 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2013-09-24 03:07:39] INFO  WEBrick 1.3.1
[2013-09-24 03:07:39] INFO  ruby 2.0.0 (2013-06-27) [x64-mingw32]
[2013-09-24 03:07:39] INFO  WEBrick::HTTPServer#start: pid=7248 port=3000

初期画面を確認してみます。アプリの環境情報が見れるようになりました。

http://localhost:3000/
ruby04


(6)Railsの、コントローラ、Viewをお試し
本格的にアプリ作成する前に、DBアクセスなしで、ちょこっと練習してみます。

まずはコントローラ作成します。

「(Railsアプリケーションのルート)」ディレクトリに移動し、次のようにコマンドを実行します。コントローラ名は、sampleにしています。

 C:\work_Apps\Ruby\Rails_Apps\test01>rails generate controller sample
      create  app/controllers/sample_controller.rb
      invoke  erb
      create    app/views/sample
      invoke  test_unit
      create    test/functional/sample_controller_test.rb
      invoke  helper
      create    app/helpers/sample_helper.rb
      invoke    test_unit
      create      test/unit/helpers/sample_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/sample.js.coffee
      invoke    scss
      create      app/assets/stylesheets/sample.css.scss

sample_controller.rbを編集します。
test01\app\controllers\sample_controller.rb

# coding: utf-8

class SampleController < ApplicationController

  def hello
    @msg = 'こんにちは。お久しぶりです。';
    render "sample/hello"
  end

  def bye
    render :text => 'bye!'
  end

end

次にビュー作成します。hello.html.erbファイルを自分で作成します。(文字コードUTF8、改行コードLF)
test01\app\views\sample\hello.html.erb

<h1>Hello</h1>
<p>
こんにちは。お元気ですか。<br>
<%= @msg %>
</p>

次に、ルーティング追加します。routes.rbファイルを修正します。
test01\config\routes.rb

以下の2行追加しています。

  (中略)

  # This is a legacy wild controller route that's not recommended for RESTful applications.
  # Note: This route will make all actions in every controller accessible via GET requests.
  # match ':controller(/:action(/:id))(.:format)'

  match 'hello' => 'sample#hello'
  match 'bye' => 'sample#bye'

end

コマンド「rails server」でアプリ起動した後、画面確認してみます。

http://localhost:3000/hello
ruby05

http://localhost:3000/bye
ruby06

ようやくこれで、完了です。

Ruby on Rails のログフォーマット変更

Ruby on Railsのログ出力内容を見てみると、時刻が出力されていません。
時刻とログレベルぐらいは出力しておきたい。っていうか、どこでフォーマット変えれるの?
というわけで、設定してみました。

<僕が使っている環境>
ruby 2.0.0p247 (32bit)
DevKit-mingw64-32-4.7.2-20130224-1151-sfx (32bit)
rails 3.2.14
Windows7 (64bit)


(1)はじめに
[Rubyインストール先]\lib\ruby\gems\2.0.0\gems\activesupport-3.2.14\lib\active_support\core_ext\logger.rb
に、Loggerの定義が書かれているみたいです。

Railsのデフォルトのログフォーマットは、logger.rbの中の、SimpleFormatterで定義されている内容が使われているみたいです。

また、カスタマイズの書き方は、こちらのサイト(Active Support Core Extensions — Ruby on Rails Guides)の、「20.3 datetime_format=」に記載されています。

(参考)
Logger!!! (ログにタイムスタンプを追加する方法) – うんたらかんたらRuby – Rubyist
[道] railsのログへ時刻/PID付与 | 今日もねむひ(-。-)zZZ


(2)やり方その1 とりあえず簡単に!
[RailsアプリのDirectory]/config/environments/development.rb
に、以下の設定を追加する。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::Formatter.new

そうすると、ログ出力内容はこんな感じになります。

I, [2013-11-26T22:38:52.008516 #37856] INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 22:38:52 +0900
I, [2013-11-26T22:38:52.281531 #37856] INFO -- : Connecting to database specified by database.yml
I, [2013-11-26T22:38:53.385594 #37856] INFO -- : Processing by FinanceController#bye as HTML

#37856というのは、プロセスIDになります。


(2)やり方その1 パート2
[RailsアプリのDirectory]/config/environments/development.rb
に、もうひとつ加えることで、日付のフォーマットをカスタマイズできます。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::Formatter.new
  config.logger.datetime_format = "%Y-%m-%d %H:%M:%S"

ログ出力内容はこんな感じ

I, [2013-11-26 22:54:28#38012] INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 22:54:28 +0900
I, [2013-11-26 22:54:28#38012] INFO -- : Connecting to database specified by database.yml
I, [2013-11-26 22:54:29#38012] INFO -- : Processing by FinanceController#bye as HTML

(3)やり方その2 フルカスタマイズ
[RailsアプリのDirectory]/config/environment.rb
の中に、フォーマットを定義します。ここでは、FormatWithTimeという名前で定義しています。($$は、pidを表します)

(注)「Initialize the rails application」の後に書くと、エラーになります。

# Load the rails application
require File.expand_path('../application', __FILE__)

class Logger::FormatWithTime < Logger::Formatter
  cattr_accessor(:datetime_format) { "%Y%m%d%H%m%S" }

  def call(severity, timestamp, progname, msg)
    "[#{timestamp.strftime(datetime_format)}.#{'%06d' % timestamp.usec.to_s}] (pida=#{$$}) #{severity} -- : #{String === msg ? msg : msg.inspect}\n"
  end

end

# Initialize the rails application
Test02Mysql::Application.initialize!

その後、
[RailsアプリのDirectory]/config/environments/development.rb
の中で、config.logger.formatter = Logger::FormatWithTime.new
すると、フォーマットが設定されます。

  config.logger = Logger.new(config.paths["log"].first)
  config.logger.formatter = Logger::FormatWithTime.new

ログ出力内容はこんな感じ。

[20131126231146.572204] (pid=39496) INFO -- : Started GET "/bye" for 127.0.0.1 at 2013-11-26 23:22:46 +0900
[20131126231146.883222] (pid=39496) INFO -- : Connecting to database specified by database.yml
[20131126231148.018287] (pid=39496) INFO -- : Processing by FinanceController#bye as HTML