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という単語。ざっくりいうとJavaScriptやcssを指しているらしい。要確認中。今まではpublicディレクトリ以下にあったjavascriptやcssをここにいれる、ではpublic以下に入らない?と気になったところ、しっかり説明されていた。
public/ The only folder seen to the world as-is. Contains the static files and compiled assets.
つまりは外部から参照できるのはここのみ、静的なファイルと圧縮されたjavascriptやcssがここに入れられるということ。開発時は複数のファイルに分割しておいて、アプリケーション稼働時には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などレスポンスの返し方なども大きく改善されているらしいので、そちらも後日触れてみたい。