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

Rails 5.x

Rails 5.x

Rails 5.0 の変更点とRails 5.1 で入りそうな変更について紹介しています

Shinichi Maeshima

August 18, 2016
Tweet

More Decks by Shinichi Maeshima

Other Decks in Technology

Transcript

  1. Rails 5.x
    @willnet

    View Slide

  2. Shinichi Maeshima
    !
    "
    #
    @netwillnet
    @willnet
    http://blog.willnet.in
    Freelance Rails Consultant

    View Slide

  3. ginza.rb

    View Slide

  4. (Rails 5.x).map(&:to_s) #=>
    [‘Rails 5.0’, ‘Rails 5.1’]

    View Slide

  5. Rails 5.0

    View Slide

  6. 新登場Rails 5

    View Slide

  7. Puma特集
    8/24発売予定

    View Slide

  8. 細かすぎて載せられなかった
    トピック

    View Slide

  9. ίʔϧόοΫνΣʔϯͷఀࢭ
    ৚݅ͷมߋ
    • 有名なやつ
    • コールバックの停止条件が「false を返す」から
    「throw(:abort)」になった
    • 4.2からアップグレードした人は後方互換性を保った設定
    になっているはず
    • config/initializers/new_framework_default.rb に
    設定ある
    w [email protected]@[email protected]
    &"&#&#$&"#&&&"'
    &&"&#$&#&&$&"%
    "&&#

    View Slide

  10. belongs_toのrequired
    オプションがデフォルトに
    • Rails 4.2より belongs_to :user, required: true
    として関連先の存在を調べるバリデーションを定義で
    きた
    • 5.0 からはデフォルトで required: true
    • オフにしたい場合は optional: true
    • 4.2からアップグレードした人は後方互換性を保った
    設定になっているはず
    • config/initializers/new_framework_default.rb
    に設定ある

    View Slide

  11. ։ൃதͷΩϟογϡͷ
    ΦϯΦϑ੾Γସָ͕͑ʹ
    w CJOSBJMTEFWDBDIFͰ։ൃதͷΩϟογϡ੾Γ
    ସ͕͑Ͱ͖Δ
    w ۩ମతʹ͸UNQDBDIJOHEFWUYUΛ࡞ͬͨΓ࡟
    আͨ͠Γ͍ͯ͠Δ͚ͩ

    View Slide

  12. ։ൃதͷΩϟογϡͷ
    ΦϯΦϑ੾Γସָ͕͑ʹ
    # Enable/disable caching. By default caching is disabled.
    if Rails.root.join('tmp/caching-dev.txt').exist?
    config.action_controller.perform_caching = true
    config.cache_store = :memory_store
    config.public_file_server.headers = {
    'Cache-Control' => 'public, max-age=172800'
    }
    else
    config.action_controller.perform_caching = false
    config.cache_store = :null_store
    end
    DPOpHFOWJSPONFOUTEFWFMPQNFOUSC

    View Slide

  13. [email protected]ͷ[email protected]
    ͕σϑΥϧτʹ
    w μϒϧΫϦοΫͰೋॏʹϑΥʔϜૹ৴Λ๷͙ͨ
    ΊͷΦϓγϣϯ[email protected]͕σϑΥϧτΦϯ
    ʹ
    w ͚ͭ๨Ε๷͛ͯ΂ΜΓ
    w [email protected]@[email protected]
    [email protected]Ͱݩͷڍಈʹ΋Ͱ͖Δ

    View Slide

  14. production 環境での起動後
    は自動読み込みが無効になる
    • http://railsguides.jp/
    upgrading_ruby_on_rails.html#production-
    %E7%92%B0%E5%A2%83%E3%81%A7%E3%81%AE%E8%B5%B7%E5%8B
    %95%E5%BE%8C%E3%81%AF%E8%87%AA%E5%8B%95%E8%AA%AD
    %E3%81%BF%E8%BE%BC%E3%81%BF%E3%81%8C%E7%84%A1%E5%8A
    %B9%E3%81%AB%E3%81%AA%E3%82%8B
    • レアケースだけど、config.autoload_paths << ‘lib' のみ
    だとはまる可能性あり
    • ↑↑では
    Rails.application.config.enable_dependency_loadingをtrue
    に設定してくださいって書いてあるけど、
    config.eagerload_paths << ‘lib’としておくだけで解決で
    きるケースが多そう

    View Slide

  15. production 環境での起動後
    は自動読み込みが無効になる
    • そもそも自動読み込みがなんなのか知らないとまずい
    • しかし説明大変なので自動読み込み関連のリンクだけ
    示します
    • 別の機会で喋るかも
    • https://esa-pages.io/p/sharing/2927/posts/
    62/7b7a658a0e590d051c42-slides.html#/
    • http://qiita.com/jnchito/items/
    79aaca1c51a0ca20ba6e

    View Slide

  16. 重たいクエリを検知しや
    すくなった
    • config.active_record.warn_on_records_fetche
    d_greater_than = 100
    • のようにすると、100より多いレコードを返すク
    エリを実行したらログにwarning出す

    View Slide

  17. 特定のテーブルのレコードのsaveメ
    ソッドを一時的に無効にできるよう
    になった
    • ActiveRecord::Base.surpress
    • コールバックで関連先のレコードを生成したく
    ないようなケースで使える
    • そもそもそんなコールバック定義すべきではな
    いのだけど、やむを得ないときに使える

    View Slide

  18. ಛఆͷςʔϒϧͷϨίʔυͷTBWFϝιο
    υΛҰ࣌తʹແޮʹͰ͖ΔΑ͏ʹͳͬͨ
    class Comment < ActiveRecord::Base
    belongs_to :commentable, polymorphic: true
    after_create -> { Notification.create! comment: self,
    recipients: commentable.recipients }
    end
    module Copyable
    def copy_to(destination)
    Notification.suppress do
    # Copy logic that creates new comments that we do not want
    # triggering notifications.
    end
    end
    end

    View Slide

  19. "3ͷϞσϧͷ͏ͪɺͲͷଐੑʹΞΫη
    ε͍ͯ͠Δ͔ΛऔಘͰ͖ΔΑ͏ʹͳͬͨ
    w [email protected]ϝιου
    w ςʔϒϧͷશͯͷΧϥϜΛऔಘ͢ΔͷΛ΍Ίͯগ
    ͠Ͱ΋଎౓Λ্͍͛ͨ࣌ʹ࢖͏
    w TFMFDUͰΧϥϜΛߜΓ͍͚ͨͲɺϏϡʔ͕ෳࡶ
    ͰͲͷΧϥϜ͕࢖ΘΕ͍ͯΔ͔ௐ΂Δͷ͕໘౗
    ͳͱ͖ʹ࢖͑Δ

    View Slide

  20. "3ͷϞσϧͷ͏ͪɺͲͷଐੑʹΞΫη
    ε͍ͯ͠Δ͔ΛऔಘͰ͖ΔΑ͏ʹͳͬͨ
    class UsersController < ApplicationController
    after_action :print_accessed_fields
    def index
    @users = User.all
    end
    private
    def print_accessed_fields
    p @users.first.accessed_fields
    end
    end

    View Slide

  21. "3ͷϞσϧͷ͏ͪɺͲͷଐੑʹΞΫη
    ε͍ͯ͠Δ͔ΛऔಘͰ͖ΔΑ͏ʹͳͬͨ
    class UsersController < ApplicationController
    def index
    @users = User.select(:name, :email)
    end
    end
    Processing by UsersController#index as HTML
    User Load (0.1ms) SELECT "users".* FROM "users"
    Rendered users/index.html.erb within layouts/application (1.0ms)
    ["name", "email"]
    গ͚ͩ͠ߴ଎Խ

    View Slide

  22. IFSPLVରԠ
    w [email protected]͕ෆཁʹ
    w ϩάͷඪ४ग़ྗ΁ͷग़ྗมߋͱɺ੩తϑΝΠϧ
    ͷ഑৴ͷ༗ޮແޮ͕؀ڥม਺Ͱ੾Γସ͑ΒΕΔ
    Α͏ʹͳͬͨ

    View Slide

  23. IFSPLVରԠ
    DPOpHFOWJSPONFOUTQSPEVDUJPOSC
    config.public_file_server.enabled =
    ENV['RAILS_SERVE_STATIC_FILES'].present?
    if ENV["RAILS_LOG_TO_STDOUT"].present?
    logger = ActiveSupport::Logger.new(STDOUT)
    logger.formatter = config.log_formatter
    config.logger = ActiveSupport::TaggedLogging.new(logger)
    end

    View Slide

  24. IFSPLVରԠ
    w IFSPLVͰ͸ɺQSPEVDUJPOͷ%#ফͪ͠ΌͬͨΜ͚ͩͲͳΜͱ͔෮چͰ͖ͳ͍ʁΈ
    ͍ͨͳ໰͍߹Θ͕ͤ݁ߏ͋ΔΒ͘͠ɺͦΕΛݮΒͨ͢Ίͷमਖ਼͕ೖͬͨ
    w SBJMTECESPQͳͲͷ%#ഁյܥλεΫ͕QSPEVDUJPO؀ڥͰؒҧ࣮͑ͯߦͯ͠͠·
    ͏ͷΛ๷ࢭ
    w %*4"#-&@%"5"#"4&@&/7*30/.&/[email protected]$)&$,ɹͱ͢Δͱ࣮ߦͰ͖Δ
    w Ұ൪࠷ޙʹ%#Λϩʔυͨ͠FOWJSPONFOUͱɺ࡟আ͢Δ%#ͷFOWJSPONFOU͕ҟͳ
    Δͱ࡟আͰ͖ͳ͍
    w EFWFMPQNFOU༻ͷϚγϯͰQSPEVDUJPOͷ%#Λؒҧͬͯফ͢Έ͍ͨͳͷΛ཈੍
    w %#࡟আ͢ΔFOWJSPONFOUͰCJOSBJMTECFOWJSPONFOUTFUͱ͢Δͱ࣮ߦͰ͖Δɹ

    View Slide

  25. IFSPLVରԠ
    w ؅ཧ༻ͷςʔϒϧΛ࡞Δඞཁ͕͋Δ
    w ͳ͍ͱCJOSBJMTECFOWJSPONFOUTFU͠Ζͱౖ
    ΒΕΔ
    w ৄ͘͠͸ͪ͜Β
    w IUUQZZBHJUVNCMSDPNQPTUSBJMT&"#
    &"&"&'EC&"#&""
    &###UBTL&"&&#&"%
    "&"&&"#
    &"&&"

    View Slide

  26. Rails 5.1

    View Slide

  27. View Slide

  28. Sprockets 4
    • v4.0.0.beta2 (2016/2/24)
    • Rails 5.1 より前に出るかも?

    View Slide

  29. Sprockets 4
    • SourceMaps
    • Manifest.js
    • ES6 Support

    View Slide

  30. SourceMaps
    • JavaScriptファイルの多いアプリケーションの開
    発が便利になる
    • Sprockets 3までは、開発中はデフォルトでファ
    イルの結合をしない
    • ファイルが増えると遅い
    • しかし結合するとエラー箇所が特定しにくい
    • Sprockets 4からはファイルを結合してもエラー
    箇所を特定できるようになった

    View Slide

  31. SourceMaps
    • demoしようかと思ったけど時間ないので↓clone
    して各自試してみてください
    • https://github.com/willnet/sprockets4-
    sample

    View Slide

  32. Manifest.js
    • これまでは application.js, application.css
    以外のファイルが欲しいときに
    config.assets.precompile +=
    [‘a.js’, ’b,js’, ’c,js’] みたいに
    application.rb に書いてた
    • これからは manifest.js に書く

    View Slide

  33. Manifest.js
    MJOLBQQMJDBUJPODTT
    MJOLBQQMJDBUJPOKT
    MJOLBKT
    MJOLCKT
    MJOLDKT
    DPOpHBTTFUTQSFDPNQJMFNBOJGFTUKT>
    BQQMJDBUJPOSC
    NBOJGFTUKT

    View Slide

  34. ES6 Support
    • babelが使えるように
    • gem ‘babel-transpiler'
    • 拡張子es6で書くとes6として扱われてコンパイ
    ルされるようになる

    View Slide

  35. Drop jQuery as a
    dependency
    • jQuery依存からの脱却
    • https://github.com/rails/jquery-ujs/pull/
    474
    • PR attathed(WIP)
    • jquery-ujs -> rails-ujs

    View Slide

  36. Provide encrypted
    secrets
    • config/secrets.ymlの改善
    • config/secrets.yml.encに暗号化された秘密
    の文字列を書く
    • 秘密鍵で複合化
    • https://github.com/rails/rails/issues/25095
    • no PR

    View Slide

  37. Provide encrypted
    secrets
    $ rails secrets:edit
    $ Please enter the master key: XXXXXX
    $ [Rails opens config/secrets.yml.enc in unencrypted form in EDITOR]
    $ [Saving the opened file will encrypt the file back into config/
    secrets.yml.enc]
    • RAILS_MASTER_KEYがあればそれを使う
    • デプロイ時はこれ

    View Slide

  38. ActiveJob.retry_on
    • ActiveJobで、「1回失敗するごとに徐々に再実
    行のタイミングを遅らせて、5回失敗したら諦め
    る」ようなことができるようになった
    • https://github.com/rails/rails/pull/25991
    • merged

    View Slide

  39. ActiveJob.retry_on
    class RemoteServiceJob < ActiveJob::Base
    retry_on CustomAppException # defaults to 3s wait, 5 attempts
    retry_on AnotherCustomAppException, wait: ->(executions) { executions * 2 }
    retry_on(YetAnotherCustomAppException) do |exception|
    ExceptionNotifier.caught(exception)
    end
    retry_on ActiveRecord::StatementInvalid, wait: 5.seconds, attempts: 3
    retry_on Net::OpenTimeout, wait: :exponentially_longer, attempts: 10
    def perform(*args)
    # Might raise CustomAppException, AnotherCustomAppException, or
    YetAnotherCustomAppException for something domain specific
    # Might raise ActiveRecord::StatementInvalid when a local db deadlock is
    detected
    # Might raise Net::OpenTimeout when the remote service is down
    end
    end

    View Slide

  40. ෳ਺%#ରԠ͢ΔΒ͍͠
    w !BSUIVSOO 3BJMTίϛολ
    ͕΍ΔΑͱݴ͍ͬͯ
    Δ
    w IUUQTTQFBLFSEFDLDPNBSUIVSOOVTJOH
    NVMUJQMFDPOOFDUJPOTJOBDUJWFSFDPSE

    View Slide

  41. ෳ਺%#ରԠ͢ΔΒ͍͠
    production:
    primary:
    database: foo
    secondary:
    database: foo_readonly
    shard:
    database: shard1
    EBUBCBTFZNM

    View Slide

  42. "SFM͕QVCMJD"1*ʹͳΔΒ
    ͍͠
    w !THSJG 3BJMTίϛολ
    ͕΍ΔΑͱݴ͍ͬͯΔ
    w IUUQRJJUBDPNKODIJUPJUFNT
    CGDC

    View Slide

  43. https://github.com/rails/rails/milestone/49
    Rails 5.1に関してもっと知りたい
    方はこちら

    View Slide

  44. Rails 5.1に関してもっと知りたい
    方はこちら
    http://y-yagi.hatenablog.com/

    View Slide

  45. enjoy

    View Slide