Rails初心者のための
Rails 5入門
Ruby / Ruby on Rails ビギナーズ勉強会 第13回
2016/5/22
宇都宮 諒(@ryo511)
This is an evolutionary release, not a revolutionary one. - Agile Web Development with Rails 5
フレームワークのAPIはほとんどRails 4と同じ
Rails 4の知識の大半はRails 5でも活かせる!
Ruby 2.2.2以上が必須(Rails 4は1.9.3以上)
インクリメンタルGC(Ruby 2.2以上)
より省メモリになり、パフォーマンスも改善
キーワード引数(Ruby 2.0以上)
railsコマンドでrakeタスクを呼べるようになった
rake test => rails test
rake db:migrate => rails db:migrate
新規追加コマンド
rails restart:tmp/restart.txt を作成する
rake restartでもOK
bin/update:bundle install、db:migrate 等、git pull後に必要になる作業を一括で実行
その他細かいものが色々
コールバックチェーンの止め方が変わった
Rails 4: コールバックでfalseを返す
Rails 5: コールバックで throw(:abort) を呼ぶ
Rails 4では生のSQLを書くか、Arelを使うか
# SELECT * FROM users WHERE name = 'Mary' OR height > 179;
User.where(name: 'Mary').or(User.where('height > ?', 179))
orメソッドが追加された
# Rails 4
User.joins("LEFT OUTER JOIN orders ON orders.user_id = users.id")
# Rails 5
User.left_outer_joins(:orders)
User.left_joins(:orders) # left_outer_joinsのエイリアス
belongs_toの対象がnilの場合にバリデーションエラー
nilを許可したい場合は↓のようにoptional: true
belongs_to :user, optional: true
Rail 4からアップグレードするとデフォルトで無効
有効にするには、config/application.rbで↓
config.active_record.belongs_to_required_by_default = true
セキュアなトークンを扱うAPIの拡張
同じ値をもつenumを定義できるようになった
Rails 4で以下のように書くとエラーになる
class Post < ActiveRecord::Base
enum status: [:active, :archived]
enum comments_status: [:active, :archived]
end
Rails 5では以下のようにprefix/suffixをつけられる
# クラス定義
class Post < ApplicationRecord
enum status: [:active, :archived], _suffix: true
enum comments_status: [:active, :archived], _prefix: :comments
end
# 実際の使い方
post = Post.new
post.active_status!
p post.status # "active"
p post.active_status? # true
双方向のCASCADE DELETEが使えるようになった
# Rails 4では以下のような関係のクラスを定義すると削除時にエラーになる
# Rails 5では、いずれかを消すと関連するレコードも削除される
class Entry < ActiveRecord::Base
has_one :position, dependent: :destroy
end
class Position < ActiveRecord::Base
belongs_to :entry, dependent: :destroy
end
rails testコマンドの導入(前述)
FailやErrorの際のバックトレースがわかりやすくなった
ディレクトリ・ファイル・行単位で実行可能になった
$ bin/rails test test/controllers/todos_controller_test.rb:13
リクエストメソッドにキーワード引数が導入された
# Rails 4
# リクエストメソッドの引数は アクション名・パラメータ・ヘッダ・Flashメッセージの順番
get :index, nil, nil, { message: "Welcome" }
post :create, name: "Fred"
xhr :post, :create, params: { name: 'Alan' }
# Rails 5
get :index, flash: { message: "Welcome" } # キーワード引数を使うことで不要な引数を省略
post :create, params: { name: "Fred" } # params で括らない書き方はDeprecated
post :create, xhr: true, params: { name: 'Alan' } # xhrメソッドはDeprecated
以下のメソッドは削除
assert_template
assigns
rails-controller-testing を入れれば使える
Action Mailer
Active Job
その他細かいものも色々ある
Railsを使って、画面がない、Web APIのみのアプリケーションを簡単に作るための仕組みが導入された
rails newコマンドに--apiオプションを渡せばOK
APIのための機能が付くわけではない
Railsから、APIにとって不要な要素を省くだけ
Rails 5最大の目玉
リアルタイムに双方向通信を行う機能
内部的にはWebSocketプロトコルを使っている
XHR: クライアントがサーバにリクエストする
WebSocket: サーバがクライアントに通知できる