トップ «前の日記(2011-12-25) 最新 次の日記(2011-12-31)» 編集

Route 477



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で実装したので、社内勉強会でその話をしました。

情報源

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

高速化と機能追加が主で、大きな(= アナウンスに書くほどの)変化はないらしい

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もサポートしてるらしい
    • JSで大きめのHTMLを生成するなら、ERBみたいなテンプレートが欲しくなるよね→EJS
    • CoffeeScirptで大きめの(略)→Eco
# 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使って展開する ようなライブラリが多いと思うけど、確かにサーバサイドでプリコンパイルした方が速そうではある。