2011-12-26
■ [rails] Rails3.1を使ってみた、あとRails 3.2とRails 4について
TL;DR: Rails3.1ではjs/cssが一級市民になったよ、あともうRails4の予定まであるらしいけどRails3ほどのbig changeではないらしいんで安心したよ
BiwaScheme BlackboardをRails 3.1で実装したので、社内勉強会でその話をしました。
情報源
- RailsGuides ( http://guides.rubyonrails.org/ )
- Rails3のことはここ読めばだいたい分かる
- Riding Rails ( http://weblog.rubyonrails.org/ )
- Rails公式ニュース
Rails 3.0 (おさらい)
Big rewrite
Rails2とMerbが合体してRails3になった
- 設計が見直され、よりすっきりした実装になった
- ルーティングの書き方がシンプルになった
- Action Mailerの使い方が変わった
- ARel
- scaffold等の生成するJSがunobtrusiveに
- Bundler導入
Rails 3.1
2011/8/31 Rails 3.1.0リリース
RailsGuidesにリリースノートがある。変更点がまとまっている
一番大きな変更は「Assets Pipeline」、アプリケーションの修正が必要 (config.assets.enabled = false でオフにしてしまうという手もあるけど、せっかくなら使ってみた方が)
あとは便利機能とか
- Reversible migration
- マイグレーションの「up」と「down」を別々に書かなくても良くなった
class MyMigration < ActiveRecord::Migration # changeメソッドに必要事項を書くだけで、up/downをよろしくやってくれる def change create_table(:horses) do t.column :content, :text t.column :remind_at, :datetime end end end
- HTTP Streaming
- レスポンスの生成が終わる前に、JSやCSSをダウンロードさせることができる
- Ruby 1.9.2が必要
- サーバが対応していることが必要(nginx+unicornとか)
- jQueryがデフォルトになった
- Identity Map
- 同一レコードに対するARのインスタンスが常に同じRubyオブジェクトになる機能
- デフォルトではオフ
Assets Pipelineとは
Rails 3.0以前:JS/CSSはpublic/javascripts, public/stylesheets以下にあった
しかし、最近のアプリだとRubyコードよりJSコードの方が多いケースまである
Rails 3.1以降:JS/CSSはapp/assets/javascripts, app/assets/stylesheets以下に
(JS/CSSが「アプリケーションの構成要素」として一級市民に)
/Users/yhara/proj/blackboard % tree app/assets/ app/assets/ ├── images │ └── rails.png ├── javascripts │ ├── application.js │ ├── bootstrap.js.coffee │ ├── codes.js.coffee │ ├── top.js.coffee │ └── users.js.coffee └── stylesheets ├── application.css ├── bootstrap_tweak.css.sass ├── codes.css.sass ├── scaffolds.css.scss └── shared.css.sass
*.coffee --(変換)--> *.js --(結合)-(圧縮)--> /assets/application-0d36b244d76a0fa1eb2fef44636ce321.js *.scss --(変換)-->*.css --(結合)-(圧縮)--> /assets/application-39b67782315f18c881afc45b0fd7a8c6.css
(developmentでは結合・圧縮は行われない)
機能の詳細はRuby on Rails Guides: Asset Pipelineを読もう
なにができるようになった?
JS/CSSが1ファイルにコンパイルされるようになった
- 例:
<link href="/assets/application-39b67782315f18c881afc45b0fd7a8c6.css" media="screen" rel="stylesheet" type="text/css"> <script src="/assets/application-0d36b244d76a0fa1eb2fef44636ce321.js" type="text/javascript"></script>
- 読み込みが速くなる
- URLにハッシュ値が入るので、JS/CSSを変更したときにブラウザのキャッシュを破棄させて変更を即座に反映させることができる
- ちなみに、Assets Pipelineは画像もサポートしている
- 変換や結合を行うわけではないが、ファイル名にハッシュ値が付くので、キャッシュ対策ができる
- ビュー内で<%= image_tag "rails.png" %>とすると、app/assets/images/rails.pngを表示できる
「JS/CSSにコンパイルされるメタ記法」が簡単に使えるようになった
- 例:
- application.css.scss -> applicaiton.css
- application.css.sass -> applicaiton.css
- applicaiton.js.coffee -> applicaiton.js
- SCSSとは:
- Hamlプロジェクトの成果物だけど、本体より有名になってないか
- SASSとは:
- HamlのCSS版
- インデントベース
- CoffeeScriptとは:
- JSにコンパイルされるインデントベース言語
- だいたいJSと同じだが、いろいろ改善されてる
- 「==」が「===」にコンパイルされるとか
- リスト内包表記があるとか
- 「.bind(this)」が簡単に書けるとか(=>)
- Rails3.1のscaffoldは、なんとscssとcoffeeが標準で生成される
- coffeeのコンパイルにはJS環境が必要だが、Win/MacではOSに入ってるJS環境を使うらしい
- もちろん生の.cssや.jsを使うこともできる(foo.css, foo.jsを置くだけ)
- foo.js.coffee.erbみたいなこともできる(!)
- でもfoo_new_path()とかは使えなかった(なんで?)
コントローラ単位でjsファイルを分けて書くようになった
- 例:codes.js.coffee, user.js.coffee
- JS書くときの見通しが良くなった
- どれだけファイルを分けても、productionでは1ファイルに結合されるので読み込みのオーバーヘッドを心配する必要なし
- (逆に言うと、特定コントローラでだけ読み込まれるというわけではないので注意)
実装
- Rails 3.1ではsprocketsというgemが標準採用された
- (スプロケット:歯車の一種、自転車の後輪についてるやつとか)
- 「//= require foo」で、foo.jsやfoo.cssがそこに埋め込まれる
- Railsではapp/asserts/(javascripts|stylesheets)/application.(js|css)にrequireが書いてある
Rails 3.2
2011/12/20 Rails 3.2 RC1が出た
Riding Rails: Rails 3.2 RC1: Faster dev mode & routing, explain queries, tagged logger, store
高速化と機能追加が主で、大きな(= アナウンスに書くほどの)変化はないらしい
- development modeでの再読み込みが速くなった
- routerが速くなった
- Journey
- aaronさんがアルゼンチンで発表してた
- ARelでSQLのexplainを簡単にできるようになった
- puts Person.active.limit(5).explain
- see also
- ロガーにタグを付けられるようになった
- Logger.tagged("foo"){...}とやると、"[foo] ..." みたいなログになる
- Active Record Store
- 謎機能
- ARをkey-value storeみたいに使えるらしい
- 実装的には、ARのserializeメソッドでHashを(デフォルトではYAMLで)文字列化してtextカラムに保存する模様
Rails 4
git masterは既に4.0.0.betaらしい(つまり3.3は出ない)
Riding Rails: Rails/master is now 4.0.0.beta
4.0.0の主な変化:「Ruby 1.9専用になる」(1.8.7のサポート終了)
逆に言うと、1.8サポートを終了するのでバージョンを4.0に上げた
なので、Rails 2→3ほどのbig changeではない
Railsは今のところだいたい2年サイクルらしい
- 2005: 1.0
- 2007: 2.0
- 2010: 3.0
- 2012: 4.0? (早ければ夏頃)(予定は未定)
■ [rails][memo] sprocketsのJavaScriptテンプレートサポート
- sprocketsのREADME見たら、JavaScript Templatingもサポートしてるらしい
# templates/hello.jst.ejs にこう書いておくと: <div>Hello, <span><%= name %></span>!</div> # application.js から、JSTという変数経由で読み込めるらしい //= require templates/hello $("#hello").html(JST["templates/hello"]({ name: "Sam" })); # jstはRubyを使ってサーバ側でjsにプリコンパイルされる
しかしちょっと待て、EJSの構文はERB風だけど、CoffeeScriptはインデントベースではないか?
どうするのかと思ったら、CoffeeScriptでもend書かせる仕様だった…
<% if @project.isOnHold(): %> On Hold <% end %>
このへんslim風の構文にすれば上手くいくんじゃないのかなぁ。記法がslimで、コード部分だけRubyじゃなくてCoffeeScriptになってるの。
jadeでなんとかなるのかな?と思ったけど、あれはNode.jsでサーバサイドで使うものだから違うと言えば違う。Rubyで動かないし(と言って、Rails環境にJS処理系が入ってたりする昨今だけど)。
(しかしRailsユーザもCoffeeScript使うようになると、サーバサイド(Node.js)におけるcoffeeの話と、クライアントサイドにおけるcoffeeの話が混ざって大変だな。)
ふつうJSテンプレートっていうと、クライアント側でJS使って展開する ようなライブラリが多いと思うけど、確かにサーバサイドでプリコンパイルした方が速そうではある。