Rails初心者のための
Rails 5入門
Ruby / Ruby on Rails ビギナーズ勉強会 第13回
2016/5/22
宇都宮 諒(@ryo511)
アジェンダ
- Rails 5の概要
- Rails 5の主要な変更点
- Rails 5の新機能の概要
- Rails 5へのアップグレード
自己紹介
- 宇都宮 諒(うつのみや りょう)
- Twitter, Facebook等では「ryo511」
- Webアプリケーションエンジニア
- 業務で主に使ってる言語はPHP, JavaScript, C#
- Rails歴:2016年1月〜
- IDEが好き(PhpStorm, Visual Studio, RubyMine等)
- アシアル株式会社所属
私のRails学習歴
- 2016/01:Rails Tutorial開始
- 並行して『初めてのRuby』
- 2016年2月末:Rails Tutorial終了
- Railsビギナーズの第11回(3月)、第12回(4月)で登壇
- 登壇はとても学習効果が高い。おすすめ
- Railsガイドが読める程度には詳しくなった
- 簡単なものならRailsで作ってもいいかなという程度には手に馴染んできた
Rails 5の現状
- (2016年5月22日現在)5.0.0rc1
- RC=Release Candidate, リリース候補
- もうすぐ正式版?
Rails 5の情報源
-
Rails Guides(Webサイト)
- 公式ドキュメント
-
Agile Web Development with Rails 5(紙・電子)
- 内容・レベル感ともにRails Tutorialと似ている
-
Rails 5 Revealed(紙・電子)
- Rails経験者向け
- 本スライドの元ネタ
-
Railsの教科書(電子書籍)
- 完全な初心者向け
Rails 5はどう変わったのか
-
This is an evolutionary release, not a revolutionary one. - Agile Web Development with Rails 5
-
フレームワークのAPIはほとんどRails 4と同じ
-
Rails 4の知識の大半はRails 5でも活かせる!
-
主な変更点(1) Ruby 2.2+
-
Ruby 2.2.2以上が必須(Rails 4は1.9.3以上)
-
インクリメンタルGC(Ruby 2.2以上)
-
より省メモリになり、パフォーマンスも改善
-
-
キーワード引数(Ruby 2.0以上)
-
主な変更点(2) railsコマンド
-
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後に必要になる作業を一括で実行
-
その他細かいものが色々
-
主な変更点(3) Active Model
-
コールバックチェーンの止め方が変わった
-
Rails 4: コールバックでfalseを返す
-
Rails 5: コールバックで throw(:abort) を呼ぶ
-
Active Recordの変更点(1)
-
Rails 4では生のSQLを書くか、Arelを使うか
# SELECT * FROM users WHERE name = 'Mary' OR height > 179;
User.where(name: 'Mary').or(User.where('height > ?', 179))
-
orメソッドが追加された
- left_outer_joinsメソッドの追加
# 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のエイリアス
Active Recordの変更点(2)
-
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の拡張
- has_secure_token
- ワンタイムトークンの実装が楽になる?
Active Recordの変更点(3)
-
同じ値をもつ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
Active Recordの変更点(4)
-
双方向の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
-
その他細かいものも色々ある
新機能(1) Rails API
-
Railsを使って、画面がない、Web APIのみのアプリケーションを簡単に作るための仕組みが導入された
-
rails newコマンドに--apiオプションを渡せばOK
-
APIのための機能が付くわけではない
-
Railsから、APIにとって不要な要素を省くだけ
-
新機能(2) Action Cable
-
Rails 5最大の目玉
-
リアルタイムに双方向通信を行う機能
-
内部的にはWebSocketプロトコルを使っている
-
XHR: クライアントがサーバにリクエストする
-
WebSocket: サーバがクライアントに通知できる
-
Rails TutorialアプリのUpgrade
- Rails 4.1.5 => 5.0.0でどの程度の作業か検証してみた
- 4.1.5 => 4.2.6はbundle updateだけで終了
- 4.2.6 => 5.0.0rc1については、以下の記事にまとめた
- 注意する必要があるのは、rails app:updateでroutes.rbや、action_mailerの設定が上書きされること
- DeprecationのWarningは結構残るが、アップグレード自体は簡単
- ≒ 後方互換性が保たれている
Deprecationとの戦い
- assert_templateがなくなった
- gem 'rails-controller-testing' で解決
- テストメソッドの書き方が変わった
- Rails 4: get :edit, id: @user
- Rails 5: get :edit, params: { id: @user }
- xhrメソッドがDeprecated
- get :post, xhr: true, { params: ...}
- アプリでは使ってないのにWarning … gemで使用?
- (before|after)_filter
- alias_method_chain
アップグレード結果
- アプリケーションのコードは無変更でOKだった
- テストコードは修正が必要
- Rails 5対応されていないgemがありそう
まとめ
- Rails 5はRails 4の延長線上にある
- メジャーバージョンアップの割に変更点は少なめ
- Rails 4の知識はRails 5でも活かせる
- (2016年5月現在では)Rails 4を覚えてからRails 5にチャレンジするのがオススメ
ご清聴ありがとう
ございました
Rails初心者のためのRails5入門
By Ryo Utsunomiya
Rails初心者のためのRails5入門
Ruby / Ruby on Rails ビギナーズ 第12回
- 7,176