Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rails 6 Upgrade "Practical" Guide

megane42
January 30, 2020

Rails 6 Upgrade "Practical" Guide

megane42

January 30, 2020
Tweet

More Decks by megane42

Other Decks in Programming

Transcript

  1. Rails 6 Upgrade "Practical" Guide megane42 / Hikaru Kazama @

    giftee 2020/01/30 gotanda.rb #41 @ Mobile Factory
  2. 自己紹介 • @megane42 • Rails 歴 1 年半 • giftee

    • 趣味 : かっこいい
 ワンタイムパスワード集め
  3. ちょっと宣伝 • 個人開発 NIGHT #3 やります! • 2020/02/06(木) 19:30 -

    • giftee @ 東五反田 • https://giftee.connpass.com/event/ 164484/ • 社内有線を作った話をします(予定)
  4. アジェンダ • 実践的な更新手順 • 変更点 25 本ノック • 5.2.4 ->

    6.0.2 • キャッチーなやつだけ紹介していきます
  5. リリースノートを読むコツ • リリースノートに対応する PR を見に行く • テストコードを読む • メソッドの前の doc

    コメントを読む • その PR に含まれる CHANGELOG を見る
 (サンプルコード付きで説明が載っていると きがある)
  6. リリースノートを読むコツ • すべてを理解しようとしない • Removals, Deprecations に関しては、
 git grep してヒットしなければ深追いしない

    • 自動テスト、手動テストを信じて次に進む • 後日、念のため `DEPRECATION WARNING` で
 ログを検索するといいかもしれない
  7. ActionDispatch:: HostAuthorization • DNS リバインディング対策のために、新しい rack middleware が導入された • DNS

    リバインディングとは : https://qiita.com/kidach1/ items/1a3d66abb80bb67e0d64 • ユーザーに罠サイトを表示させたあと、罠サイトのドメ インの A レコードを攻撃対象サイトの IP に向け変える ことで、罠サイトの JS を攻撃対象サイトに向けて実行さ せる 1/25
  8. ActionDispatch:: HostAuthorization • ホスト名のホワイトリストを Rails.application.config.hosts に追加できる • development では全 IP

    アドレスと localhost がデフォルトで許可済み • 他の環境ではデフォルトで未設定 = 全許可 なので、取り急ぎ作業は不要 1/25
  9. rails routes —expanded • `-g キーワード` で絞り込みも可能 root@670934a4e388:/app# rails routes

    --expanded -g user --[ Route 1 ]---------------------------- Prefix | new_admin_user_session Verb | GET URI | /admins/sign_in(.:format) Controller#Action | admins/sessions#new --[ Route 2 ]---------------------------- Prefix | admin_user_session Verb | POST URI | /admins/sign_in(.:format) Controller#Action | admins/sessions#create 2/25
  10. ActionDispatch::Request::
 Session#dig session[:user] = { id: 1, icon: “http://example.org/nyancat.jpg” }

    # ͜Ε·Ͱ session[:user][:icon] # ࠓ౓͔Β͜͏ॻ͚Δ session.dig(:user, :icon) • session を dig できるようになった 5/25
  11. ActiveRecord::Relation
 #extract_associated • スコープで絞り込みつつ、その関連だけを 取ってこれる Post.active.extract_associated(:comments) => [ #<Comment id:

    1, content: "foo", post_id: 1, …>, #<Comment id: 2, content: "bar", post_id: 1, …>, #<Comment id: 3, content: "baz", post_id: 2, …> ... ] 6/25
  12. ActiveRecord::Relation
 #annotate • なんかの調査時に役立ちそう Post.annotate("this is a comment”) .where(id: 123)

    .to_sql # => SELECT “posts”.* FROM “posts" WHERE "posts"."id" = 123 /* this is a comment */ 7/25
  13. insert_all(!) / upsert_all • `activerecord-import` gem と違って、 ActiveRecord オブジェクトを生成しない •

    (+) より早い • (-) バリデーションやコールバックが実行さ れない 12/25
  14. Enum から negative scopes
 が生えた • `not_xxx` が使えるようになった class Post

    < ActiveRecord::Base enum status: %i[ drafted active trashed ] end
 # ͜Ε·Ͱ
 Post.where.not(status: :drafted) # ࠓ౓͔Β͜͏ॻ͚Δ Post.not_drafted 13/25
  15. 子がユニークじゃないときに
 親を save したときの挙動が変わった • 下記を実行するとどうなるでしょう?
 (parent has_many children とする)

    parent = Parent.new(children: [ Child.new(name: ‘Wiske'), Child.new(name: ‘Wiske') ]) parent.save ユニーク制約違反 17/25
  16. 子がユニークじゃないときに
 親を save したときの挙動が変わった • 5 以前 : 親と最初の子までは save

    される • 6 以降 : 親も子も save されない parent = Parent.new(children: [ Child.new(name: ‘Wiske'), Child.new(name: ‘Wiske') ]) parent.save ユニーク制約違反 17/25
  17. Date, DateTime, Time, TimeWithZone #before? / #after? • 不等号が辛くなったら思い出してください #

    ͜Ε·Ͱ Date.new(2020, 1, 30) < Date.new(2020, 1, 31) 
 # ࠓ౓͔Β͜͏ॻ͚Δ Date.new(2020, 1, 30).before?(Date.new(2020, 1, 31)) 18/25
  18. Enumerable#index_with • これが役立つときに思い出せるかどうか… post = Post.new(title: "hey", body: "what's up?")

    [:title, :body].index_with do |attr| post.public_send(attr) End # => { title: "hey", body: "what's up?" } 19/25
  19. Hash# deep_transform_values(!) • transform_values(!) は ruby にあるが、
 ネストしていると意図した結果にならない hash =

    {a: 1, b: {c: 2} } hash.transform_values { |v| v.to_s } # => {:a=>"1", :b=>"{:c=>2}"}
 hash.deep_transform_values { |v| v.to_s } # =>{:a=>"1", :b=>{:c=>"2"}} 20/25
  20. その他 : ActiveRecord のもろもろ • ActiveRecord 周りの変更 3 点について kamipo

    さん自ら解説した記事
 https://blog.kamipo.net/entry/2019/05/ 15/152652 22/25
  21. その他 : メジャーどころ • Webpacker 標準化 • ActionText • Zeitwerk

    (a.k.a. Z-loader) • https://qiita.com/alfa/items/3a432c31346a705d0690 • ちなみに Rails 6.0.2 だと `rails zeitwerk:check` がコケます 25/25
  22. Rails 6 Upgrade "Practical" Guide megane42 / Hikaru Kazama @

    giftee 2020/01/30 gotanda.rb #41 @ Mobile Factory