※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
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