Rails初心者のための

Rails 5入門

 

Ruby / Ruby on Rails ビギナーズ勉強会 第13回

2016/5/22

宇都宮 諒(@ryo511)

アジェンダ

  1. Rails 5の概要
  2. Rails 5の主要な変更点
  3. Rails 5の新機能の概要
  4. 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 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,167