SlideShare a Scribd company logo
最近のRails事情 - 4.1!
author: ‘@ke_tachibana’
about: gem ‘rails’, ‘4.1.0.beta1’
generated_by: ‘slideshow(s9) gem (https://github.com/slideshow-s9/slideshow)’
Preloader組み込みで色々高速起動
railsチーム謹製PreloaderであるSpringがデフォルトで組み込み
rails系コマンドの起動の遅さを改善するプログラム
初期化処理の終わったプロセスをあらかじめ立ち上げておく仕組み
対応するコマンド
rails, rake, rspec, cucumber, testunitあたり
つまり、このへんが高速起動する(2回目から)
rails console
rails generate
rake db:migrate
rake routes
rake db:seed
rspec spec/models/foo.rb
実際1.5秒が0.3秒くらいになった
注意点
railsとrake以外は別のgemに分離されている
Gemfile:
gem 'spring' # これは元から書いてある
gem 'spring-commands-rspec' # これを追加しよう
使い方
$ spring binstub rspec # ./binにrspecコマンドが出来る
$ bin/rspec # bundle execとspringを通してrspecを実行する

railsコマンドはbin/を付けなくても良い模様
rakeコマンドはプロジェクト生成時にbinstubされている模様
direnv (https://github.com/zimbatm/direnv) などを使えば、railsディレクトリに入っ
た時だけ./binをPATHに追加したりできる
秘密の設定値を格納するファイルが標準化
“config/secrets.yml”
development:
secret_key_base: 3b7cd727ee24e8444053437c36cc66c3 #=> これはRails標準のキー
my_api_key: FOOBAR # => 好きなのを追加できる
production:
my_api_key: <%= ENV['OTHER_API_KEY'] %> #=>

これも出来る

取得:
Rails.application.secrets.my_api_key # => 'FOOBAR'

githubなどに入れることを考えると
ダミーにしておく
erb記法で環境変数からアクセスする
いずれにしてもアプリケーション内での取得方法を統一できる
Viewのバリエーションを自動切り替え
samples_controller.rb:
before_action do
request.variant = :tablet if request.user_agent =~ /iPad/
end

以下を自動選択:
app/views/samples
/index.html.erb
/index.html+tablet.erb
misc:
index.html.erbは無いと駄目(当然)
index.html+smartphone.erbとかは無くても良い(index.html.erbが使われる)
特定のvariantだけredirectとか、もっと細かい制御も可能(詳しくはWebで!)
メールのプレビュー機能が組み込まれた
#{Rails.root}/test/mailers/previews/notifier_preview.rb に (/test !)
class NotifierPreview < ActionMailer::Preview
def welcome
Notifier.welcome(User.first)
end
end

を置いて
http://localhost:3000/rails/mailers

previewの一覧が!
http://localhost:3000/rails/mailers/notifier/w

previewにフォーマットの切り替えまで!(ビューが複数ある場合)
paramsは使えないのでpreviewを動的に変える方法は無いかも
ちなみに
ダミーSMTPというアプローチも (Rails 4.1とは関係ないが)

ダミーSMTPソフト
SMTPを受け入れるが中継する代わりに自分で保持するサーバー。Webやメーラーなどで表示で
きる。
MailCatcher http://mailcatcher.me/
($gem install mailcatcher で入るSinatraアプリケーション)
FakeSMTP http://nilhcem.github.io/FakeSMTP/
(Java GUIアプリケーション)
Mailtrap http://mailtrap.io/
(オンラインのサービス)
ActiveRecordにenumフィールドが
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
conversation.archived! # statusをarvhivedにする
conversation.status = 'archived' # 同じくstatusをarchivedにする
conversation.status = 'foo' # ArgumentError: 'foo' is not a valid status
conversation.active? # => false statusがactiveかどうか
conversation.status

# => “archived” 文字列で返される

conversation.status_before_type_cast # => 0 DBの生の値
Conversation::STATUS # => { "active" => 0, "archived" => 1 }
Conversation.archived # => ActiveRecord::Relation statusがarchivedなものだけのscope
misc
DBのカラム型はinteger
複数の属性が同じ名前の項目を持つときは多分困る
active, vote_activeなどとstatus名を分ける必要がある
定義はHashでも良い。むしろ明示した方が良い?
class Conversation < ActiveRecord::Base
enum status: { active: 1, archived: 2 }
end

whereには数値で与える必要がある
Conversation.where(status: 'active').to_sql
# => 'SELECT "conversation".* FROM "conversation" WHERE "conversation"."status" = 0'
# oh...
Conversation.where(status: 1).to_sql
# => 'SELECT "conversation".* FROM "conversation" WHERE "conversation"."status" = 1'
属性名を指定するだけで”pretty”なURLが作れる
class User < ActiveRecord::Base
to_param :name
end

index.erb:
<% user = User.new(name: 'myname') %>
<%= link_to 'Show User', user %>

↓
<a href="/users/1-myname">Show User</a>

先頭にidが付くので、String#to_iの仕様により User.find(params[:id]) はそのまま動く
activerecord/lib/active_record/integration.rb:
def to_param(method_name)
define_method :to_param do
if (default = super()) && (result = send(method_name).to_s).present?
"#{default}-#{result.truncate(20, separator: /s/, omission: nil).parameterize}"
else
default
end
end
end

日本語は消える
20文字以上も消える
User#to_paramを自分で実装しても良い
class User < AR::Base
def to_param
name
end
end

Rails 4.1以前からあった仕様
上記の場合、controllerではUser.find_by!(name: params[:id])とする
便利メソッド追加(ActiveSupport)
マッチする文字を削除する String#remove
'My name is FOO'.remove(/s/) # => 'MynameisFOO'

Dateが属する週、月、四半期、年の範囲をRangeで
day = Date.new(2014,
day.all_week
# =>
day.all_month
# =>
day.all_quarter # =>
day.all_year
# =>

1, 15)
Mon, 13
Wed, 01
Wed, 01
Wed, 01

Jan
Jan
Jan
Jan

2014..Sun,
2014..Fri,
2014..Mon,
2014..Wed,

19
31
31
31

複数のキャッシュを一度にfetchするfetch_multi
Rails.cache.write(:a, 1)
Rails.cache.write(:b, 2)
Rails.cache.fetch_multi(:a, :b) # => [1, 2]

Jan
Jan
Mar
Dec

2014
2014
2014
2014
その他
Queue APIはまた入らなかった
Module#concerningを省略した
が、結構大事な気がする
モデル内部をグループ化して名前を付ける機能
Product内部をSearchingとPurchasingとReviewingに分類したりする
時間をstubするテストヘルパ#travel, #travel_to が入ったはずだが、RSpecでは使えな
い?
rake db:test:prepare タスクが消えたらしい
テスト実行時に必ず暗黙的にDBをセットアップするようになったらしい
外部キーなど必須のレガシーDBではどうするかまだ調査中
ありがとうございました

More Related Content

最近のRails事情 - 4.1!