Rails 4.1 の新機能

※1/15 ActionMailerPreviewについて追記
Rails4.1の新機能Action Mailer Previewsとは - rochefort's blog


What's new in Rails 4.1 - Coherence Blog

公式blogに掲載されてたので見てみました。結構面白い機能が搭載されてそうです。
ご興味のある方は是非原文をご覧ください。

Overview

Active Record Enums

ARでstausとか何とか区分みたいなのをattributeとして用意するときに
enum使いたいという要望はよくあるかと思います。
最近だとDBにenumの機能が実装されていることがありますが、
通常アプリケーション側で実装し、DBは数値か文字列かを突っ込むというをよくやります。
 
そんな場合Rails側は、Hashを使ったり、固定値(大文字定義の変数)で定義するというようにしていました。

Rails4.1では下記のような実装が可能なようです。
これは使えそうです。

enum status: [ :unverified, :confirmed, :assigned, :in_progress, :resolved, :rejected, :reopened ]

valueを定義する場合。

class Bug < ActiveRecord::Base
  enum status: {
    unverified: 0,
    confirmed: 1,
    in_progress: 3,
    resolved: 4,
    rejected: 5,
    reopened: 6
  }
end

利用する際はsymbolでok。

self.status = :assigned

 
 
注意事項。

class Bug < ActiveRecord::Base
  enum status: [ ..., :assigned, ... ]
  enum code_review_status: [ ..., :assigned, ... ] # WARNING: Don't do this!
end

ただし、似たようなenumを複数使用する場合は要注意です。
将来的にはexceptionを挙げるようにするとのこと。
またDirty method _was? はまだ未対応。
 

Action Pack Variants

こんな感じで html.phone、html.tablet みたいなformatを定義できるようになります。
show.html+phone.erb を個別に書けばok。
昨今responsive desingが流行っていたりしますが、多くの場合銀の弾丸となり得なく
デバイス毎にコンテンツを用意したりしないといけなくてつらいので
そんなつらい目に遭ってる人用ということだそうです。

class PostController < ApplicationController
  def show
    @post = Post.find(params[:id])

    respond_to do |format|
      format.json
      format.html               # /app/views/posts/show.html.erb
      format.html.phone         # /app/views/posts/show.html+phone.erb
      format.html.tablet do
        @show_edit_link = false
      end
    end
  end
end

定義例。user_agentで判別していますが、subdominとか何でもありですね。

class ApplicationController < ActionController::Base
  before_action :detect_device_variant

  private

    def detect_device_variant
      case request.user_agent
      when /iPad/i
        request.variant = :tablet
      when /iPhone/i
        request.variant = :phone
      end
    end
end

Spring

似たようなgemにZeusやSporkなどがありますがSpring押しなようです。
試しにprojectを作成してみたら、勝手にsetupされました。

$ rails new blog410beta
(略)
         run  bundle exec spring binstub --all

Gemfile、bin以下。

gem 'spring',        group: :development
$ cat bin/rails
#!/usr/bin/env ruby

if !Process.respond_to?(:fork) || Gem::Specification.find_all_by_name("spring").empty?
  APP_PATH = File.expand_path('../../config/application',  __FILE__)
  require_relative '../config/boot'
  require 'rails/commands'
else
  ARGV.unshift "rails"
  load Gem.bin_path("spring", "spring")
end
$ cat bin/rake
#!/usr/bin/env ruby

if !Process.respond_to?(:fork) || Gem::Specification.find_all_by_name("spring").empty?
  exec "bundle", "exec", "rake", *ARGV
else
  ARGV.unshift "rake"
  load Gem.bin_path("spring", "spring")
end

installして試してみる。

$ gem i rails -v=4.1.0.beta1
$ rails new blog410beta
$ cd blog410beta
$ rails generate scaffold posts name:string
$ ./bin/rake db:migrate

test初回実行。

$ time bin/rake test test/controllers/posts_controller_test.rb
Run options: --seed 6194

# Running:

.......

Finished in 0.935683s, 7.4812 runs/s, 13.8936 assertions/s.

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips
bin/rake test test/controllers/posts_controller_test.rb  0.15s user 0.07s system 11% cpu 1.905 total


ontrollers/posts_controller_test.rb  0.15s user 0.07s system 11% cpu 1.905 total

test2回目実行。(早くなっとる。ってことでいいんだろうか。)

$ time bin/rake test test/controllers/posts_controller_test.rb
Run options: --seed 55252

# Running:

.......

Finished in 0.144697s, 48.3770 runs/s, 89.8429 assertions/s.

7 runs, 13 assertions, 0 failures, 0 errors, 0 skips
bin/rake test test/controllers/posts_controller_test.rb  0.15s user 0.07s system 25% cpu 0.865 total

ちなみにspringの状況は下記で確認できます。

$ spring status
Spring is running:

34887 spring server | blog410beta | started 4 mins ago
34888 spring app    | blog410beta | started 4 mins ago | development mode
34970 spring app    | blog410beta | started 4 mins ago | test mode

・Action Mailer Previews
templateが楽になったのかな。あんまりaction mailerは詳しくないので、深追いしていません。
調べてみました。
Rails4.1の新機能Action Mailer Previewsとは - rochefort's blog
・Application Message Verifier
tokenをstoreしないでstatelessな処理に便利そうな機能のようです。

See Also

What's new in Rails 4.1 - Coherence Blog
Rails4.1.0 beta release - rochefort's blog
rails/spring
Rails4.1の新機能Action Mailer Previewsとは - rochefort's blog