massの日記

日々の薪

Rails3.1.0を試してみた

ようやくRails3.1.0を試してみた。

環境

$ ruby-v
$ ruby 1.9.2p290 
$ gem --version
$ 1.8.10
$ bundle -v 
$ Bundler version 1.0.18

今回の試みとしてRailsはbundleで管理。つまりは、アプリケーション内で扱うgemとして入れてみた。

$ mkdir music_box
$ cd music_box
$ emacs Gemfile

この時点でGemfileはrailsしか書いていない。

#Gemfileの中身
source 'http://rubygems.org'
gem 'rails', '3.1.0'

Railsをbundleでインストールして、自分自身のディレクトリパスを指定してrails newする。rspecを使うため、-Tのオプションをつけた。
後は、rspecのインストールを行ってからscaffoldコマンドを使用。最後にrake db:migrateを叩いた。

$ bundle install --path ./vendor/bundle
$ bundle exec rails new ../music_box -T
$ bundle install
$ bundle exec rails generate rspec:install
$ bundle exec rails generate scaffold Music title:string path:text image:text content_type:integer
$ bundle exec rake db:migrate
$ bundle exec rails s

ここまでは大分駆け足だけれどRailsGuide Getting Startedの内容にそった形での動き。次からが大きな変更点となり、まだ学習中の場所。

app/	Contains the controllers, models, views and assets for your application. You’ll focus on this folder for the remainder of this guide.

Rails2系では見慣れなかったassetsという単語。ざっくりいうとJavaScriptcssを指しているらしい。要確認中。今まではpublicディレクトリ以下にあったjavascriptcssをここにいれる、ではpublic以下に入らない?と気になったところ、しっかり説明されていた。

public/	The only folder seen to the world as-is. Contains the static files and compiled assets.

つまりは外部から参照できるのはここのみ、静的なファイルと圧縮されたjavascriptcssがここに入れられるということ。開発時は複数のファイルに分割しておいて、アプリケーション稼働時には1ファイルにまとめるといったことができるのかな?
いくつか知っているようで知らない単語があったので、後日調べようと思ったのがscssとcoffescript、前者はコンパイルしてcssを作成するもので、後者はコンパイルしてjavascriptを作成するもの。coffescriptは勉強会に参加したこともあり、具体的にイメージできたけれど、前者はまだ未知の領域。

内部の処理も相当変わっているのだけれど、フレームワーク的、というかWebアプリケーションという意味でcompileが内包されたのは大きな見所だと思うので、今回は外からjsとcssを入れてみることにした。内部で新しく書くものはscssとcoffescriptで書くにしても、既存の外部ライブラリはどうやって使うの?と単純に疑問に思ったのが理由。
入れたのはjQueryMobile。Officialからjsとcssを取ってきて、下記のように配置。

$ mv ~/jquery.mobile-1.0b3.min.css vendor/assets/stylesheets

cssはvendor内にあるassetsに入れた。lib内にもassetsフォルダがあったのだけれど、stylesheetsのディレクトリがデフォルトであったのはvendor/assets内だったのでこちらに入れるのかと考えた。しかしjavascriptを入れる場所が見当たらない。そういえば、jquery-railsというgemでjqueryが入っているのでひとくくりで扱いたいと考えた結果、gemのreadmeでも見てみようと思い立ち、結果として下記の場所にいれた。

$ mv ~/jquery.mobile-1.0b3.min.js vendor/bundle/ruby/1.9.1/gems/jquery-rails-1.0.14/vendor/assets/javascripts/jquery.mobile-1.0b3.min.js

多分、本来はここではない。そもそも、mobileとpcのjqueryをひとくくりにしてはダメなんだけど、今回はテスト用PJということでここに置いておく。そして配置したjsやcssが自動でとりこまれるわけではなくapp/assets/javascripts/application.jsとapp/assets/stylesheets/application.cssに記入を追加して初めて取り込まれる。

#application.jsに下記を追記。
//= require jquery.mobile-1.0b3.min
#application.cssに下記を追記。
 *= require_tree ../../../vendor/assets/stylesheets/

これで外部からのjsやcssを取り込めた。
そして今回jQueryMobileを使ってみたので、どうせなら実機でみてみたいと考えてHerokuにdeployしてみることにした。

Herokuのデプロイ×Rails3.1は初。他サイトを参考にした結果として、流れは下記のような感じ。

#GemfileにHeroku環境用のgemを追記
group :production do
  # gems specifically for Heroku go here
  gem "pg"
  gem 'therubyracer-heroku'
end

Gemfileに追記すると同時にbundle install --without produtionを実行しておく。Gemfileに追記しただけだと、Gmefile.lockには何も変化がなくbundle installがまだ行われていないという形になる。ただし、production用環境にのみ必要なgemなのでlocalに入れたくない、ということで、--without productionをつけている。こうするとGemfile.lockは更新されるが、ローカル環境にはgemは入らない。

そして、一つ見落としていたのが下記の作法。

$ RAILS_ENV=production bundle exec rake assets:precompile
$ git add public/assets

assets内のものをproduction環境用にコンパイルしないといけない。
後はいつも通りにHerokuにpush,db:migrateすれば完了。

$ heroku create music_box
$ git push heroku master
$ heroku rake db:migrate

で、できたのはこんな感じ。PCのデザインは未着手。だってjQueryMobileが試したかっただけだから。内容としてはいつもyoutubeで探している動画?というか音楽をstackしていくだけのもの。作った当初はyoutube=音楽きく場所だったけれど、考えてみればvideoだと思ったので名前が微妙になったのは蛇足。

HttpStreamingなどレスポンスの返し方なども大きく改善されているらしいので、そちらも後日触れてみたい。