Slide 1

Slide 1 text

Rails 5.x @willnet

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

ginza.rb

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

Rails 5.0

Slide 6

Slide 6 text

新登場Rails 5

Slide 7

Slide 7 text

Puma特集 8/24発売予定

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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 に設定ある

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

։ൃதͷΩϟογϡͷ ΦϯΦϑ੾Γସָ͕͑ʹ # 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

Slide 13

Slide 13 text

TVCNJU@UBHͷEJTBCMF@XJUI ͕σϑΥϧτʹ w μϒϧΫϦοΫͰೋॏʹϑΥʔϜૹ৴Λ๷͙ͨ ΊͷΦϓγϣϯEJTBCMF@XJUI͕σϑΥϧτΦϯ ʹ w ͚ͭ๨Ε๷͛ͯ΂ΜΓ w DPOpHBDUJPO@WJFXBVUPNBUJDBMMZ@EJTBCMF@TV CNJU@UBHGBMTFͰݩͷڍಈʹ΋Ͱ͖Δ

Slide 14

Slide 14 text

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’としておくだけで解決で きるケースが多そう

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

ಛఆͷςʔϒϧͷϨίʔυͷ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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

"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

Slide 21

Slide 21 text

"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"] গ͚ͩ͠ߴ଎Խ

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

Rails 5.1

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

Sprockets 4 • SourceMaps • Manifest.js • ES6 Support

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

Manifest.js MJOLBQQMJDBUJPODTT MJOLBQQMJDBUJPOKT MJOLBKT MJOLCKT MJOLDKT DPOpHBTTFUTQSFDPNQJMF<NBOJGFTUKT> BQQMJDBUJPOSC NBOJGFTUKT

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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があればそれを使う • デプロイ時はこれ

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

enjoy