Slide 1

Slide 1 text

My patches for Rails 5 @k0kubun TokyuRubyձٞ10

Slide 2

Slide 2 text

ࣗݾ঺հ • Twitter, GitHub: @k0kubun • Cookpad • ٕज़෦։ൃج൫άϧʔϓ • RailsͷϑΝϯ • ίϛοτ਺͸7

Slide 3

Slide 3 text

ࠓ೔࿩͢͜ͱ • ๻͕ Rails 5.0 ʹ͍ΕͨҎԼͷύονʹؔͯ͠ࢥ͏ ͜ͱΛ࿩͠·͢ • #22722 Use CGI.escapeHTML for html escape • #18109 Allow joins to be unscoped • #22125 Alias left_joins to left_outer_joins

Slide 4

Slide 4 text

Use CGI.escapeHTML for html escape https://github.com/rails/rails/pull/22722

Slide 5

Slide 5 text

#22722 Use CGI.escapeHTML for html escape

Slide 6

Slide 6 text

#22722 Use CGI.escapeHTML for html escape • erbͷHTMLΤεέʔϓʹgsubͷݺͼग़͠Ͱ͸ ͳ͘ CGI.escapeHTML Λ࢖͏Α͏ʹ͢Δౕ • Ruby 2.3 Ͱ CGI.escapeHTML Λߴ଎Խͨ͠

Slide 7

Slide 7 text

CGI.escapeHTMLͷߴ଎Խύον

Slide 8

Slide 8 text

• ݩ͸୯ͳΔ gsub(/[&"'><]/, { '&' => '&', .. }) • ͜ΕΛ͔ͳΓ۪௚ʹCʹॻ͖௚͚ͨͩ͠ • UTF-8ؚΉASCIIޓ׵ͷΤϯίʔσΟϯάͰ࠷େ 7ഒߴ଎Խ • ext/cgi/escape ര஀ CGI.escapeHTMLͷߴ଎Խύον

Slide 9

Slide 9 text

ͳͥHTMLΤεέʔϓΛߴ଎Խ ͔ͨ͠ • RailsͷerbͷϨϯμϦϯάͰHTMLΤεέʔϓ͕Ϙ τϧωοΫͩͬͨ͠ɺଞʹ଎͘͠Α͏͕ͳ͍͔Β

Slide 10

Slide 10 text

Ͳͷ͘Β͍มΘ͔ͬͨ • લఏ஌ࣝ: String࿈݁ͷݱࡏͷੑೳൺֱ TMJNͷDPNQJMFECFODIͷ)5.-Τεέʔϓ༗ޮ൛ JT IBNMJU W TMJN W GBNM W FSVCJT W IBNM WCFUB https://travis-ci.org/k0kubun/hamlit/jobs/131694989

Slide 11

Slide 11 text

Ͳͷ͘Β͍มΘ͔ͬͨ • ActionViewͰͷݩʑͷੑೳൺֱ https://gist.github.com/k0kubun/e9363d8359d9a9604c55bd23fb28c64d લͷϖʔδͷౕͷ"DUJPO7JFXԽ൛ FSCͷ$(*FTDBQF)5.-Խͳ͠ JT IBNMJU W TMJN W GBNM W "75FNQMBUF )FMQFST&SVCJT IBNM WCFUB

Slide 12

Slide 12 text

Ͳͷ͘Β͍มΘ͔ͬͨ • ActionViewͰͷerbͷCGI.escapeHTMLԽͷޮՌ https://gist.github.com/k0kubun/3ea0c0dba78ac2e832c8fbe5a104d04b લͷϖʔδͷౕͷ"DUJPO7JFXԽ൛ FSCͷ$(*FTDBQF)5.-Խ͋Γ JT IBNMJU W TMJN W GBNM W "75FNQMBUF )FMQFST&SVCJT IBNM WCFUB

Slide 13

Slide 13 text

RailsͰ࠷଎ͷςϯϓϨʔτΤϯδϯ • Hamlit ͔ σϑΥϧτͷ ActionView::Template::Handlers::Erubis • Ͳͬͪ΋๻͕଎ౕͨ͘͠ͳͷͰͲͬͪ࢖ͬͯ ͘Εͯ΋͍͍Ͱ͢

Slide 14

Slide 14 text

Allow joins to be unscoped https://github.com/rails/rails/pull/18109

Slide 15

Slide 15 text

#18109 Allow joins to be unscoped

Slide 16

Slide 16 text

#18109 Allow joins to be unscoped • (join͢Δ)includes, eager_load, joins Ͱ unscopedΛ࢖ͬͯ default_scope ͕֎ͤΔΑ ͏ʹͳΔ • 2೥͝͠ͷϚʔδ

Slide 17

Slide 17 text

default_scopeͷҋ • Ͳ͏΍ͬͨΒdefault_scopeͷόάमਖ਼ΛϚʔδ ͯ͠΋Β͑Δ͔૬ஊͯ͠Έͨ

Slide 18

Slide 18 text

default_scopeͷҋ • default_scopeʹࢥ͍ೖΕͷ͋Δίϛολʔ͕ ͍ͳ͍ͷͰ࢖͏΂͖Ͱ͸ͳ͍

Slide 19

Slide 19 text

• ࣮ࡍͣͬͱϚʔδ͞Εͳ͔ͬͨ default_scopeͷҋ ↑ݴٴͯ͠Δissue͕ผͷํ๏Ͱղܾ͞ΕͨͷͰηϧϑΫϩʔζ

Slide 20

Slide 20 text

default_scopeͷҋ • ผͷϓϧϦͰ͸default_scopeʹݴٴ͠ͳ͍Α ͏ʹͨ͠ΒϚʔδ͞Εͨ

Slide 21

Slide 21 text

default_scope͕֎ͤͳ͍ྫ • ͖ͬ͞ͷύον͕Ϛʔδ͞Εͯͳ͍ͷͰɺ

Slide 22

Slide 22 text

default_scope͕֎ͤͳ͍ྫ • preloadͯ͠Δ͔Ͳ͏͔Ͱ݁Ռ͕มΘΔ

Slide 23

Slide 23 text

Rails 5 ʹ΋࢒Δdefault_scopeͷόά • preload΍(join͠ͳ͍)includes͸ default_scope͕֎ͤͳ͍

Slide 24

Slide 24 text

Rails 5 ʹ΋࢒Δdefault_scopeͷόά • Ͱ΋ࢿྉ࡞ͬͯͨΒ΍ͬͺ௚ͬͯཉ͘͠ͳͬ ͨͷͰࠓ೔ϓϧϦग़͠௚͠·ͨ͠

Slide 25

Slide 25 text

Alias left_joins to left_outer_joins https://github.com/rails/rails/pull/22125

Slide 26

Slide 26 text

#22125 Alias left_joins to left_outer_joins

Slide 27

Slide 27 text

#22125 Alias left_joins to left_outer_joins • left_outer_joins ͷΤΠϦΞε left_joins Λ௥Ճ ͢Δ͚ͩ • ౰ͨΓલ͚ͩͲҒ͍ͷ͸๻ͷϓϧϦͰ͸ͳ͘ left_outer_joins Λ௥Ճ͢ΔํͷϓϧϦ • ·͋Ͱ΋left_outer_joinsͱ͔௕͗ͯ͢࢖Θͳ ͍ΑͶ

Slide 28

Slide 28 text

ͦ΋ͦ΋ͳΜͰ left_outer_joins ͕ͦΜͳʹཉ͔͔ͬͨ͠ • ߜΓࠐΈͨΊͷLEFT OUTER JOINΛੜSQLΛ ࢖Θͣʹॻͨ͘ΊʹincludesΛ࢖͏ਓ͕͍Δ • eager loadͯ͠࢖͏Θ͚Ͱ΋ͳ͍Ϩίʔυͷ AR::BaseΠϯελϯε͕େྔʹ࡞ΒΕ஗͍ • ͦ͏͍͏༻్ͷϝιου͡Όͳ͍ͱϨϏϡʔ ͢ΔͱΠϯλʔωοτΛࠜڌʹ൓ൃ͞ΕΔ

Slide 29

Slide 29 text

ͦ΋ͦ΋ͳΜͰ left_outer_joins ͕ͦΜͳʹཉ͔͔ͬͨ͠

Slide 30

Slide 30 text

ͦ΋ͦ΋ͳΜͰ left_outer_joins ͕ͦΜͳʹཉ͔͔ͬͨ͠ • eager loading͕ෆཁͳΒRails 4ҎԼͰ͸ੜΫ ΤϦॻ͍ͨํ͕Ϛγͱࢥ͍ͬͯ·͢ • Rails 5Ͱ΍ͬͱͦ͏͠ͳͯ͘Α͘ͳΔ

Slide 31

Slide 31 text

༨ஊ: ͦͷincludesຊ౰ʹ଎͘ ͳΔ͔֬ೝͯ͠Δʁ • N+1௵ͯ͠ΫΤϦ͚ͩ଎ͯ͘͠΋τʔλϧͰ଎͘ͳΔͱ͸ ݶΒͳ͍ • ಛʹhas_many associationΛeager loadingͯ͠AR::Base ͕ಉ࣌ʹେྔʹ࡞ΒΕΔ৔߹ • ʮincludes଍ͯ͠N+1ͳ͘͠·ͨ͠ʂʯΈ͍ͨͳϓϧϦɺ લޙͷ଎౓ࠩΛషͬͯ΄͍͠ • rails sͷϩάݟΔ͚ͩͰ΋Θ͔Δ

Slide 32

Slide 32 text

༨ஊ: ͦ΋ͦ΋Զ͸includesࣗମ ͕ݏ͍ͩ • ࢖͏ਓͷؾ͕࣋ͪશ͘Θ͔Βͳ͍ • includesΛݟ͚ͨͩͰ͸Ͳ͏͍͏ڍಈΛ͢Δͷ͔༧ଌͰ͖ͣ Մಡੑ͕௿͍ • JOIN͢Δͭ΋Γͳ͍ॴͰJOIN͞ΕͨΒΤϥʔʹͳͬͯཉ͍͠ • includes(:foo).references(:foo)ͱ͔includes(:foo).joins(:foo) Έ͍ͨͳ৑௕ͳॻ͖ํ͕ؾʹͳΔ • eager_load(:foo)Ͱ͍͍͡ΌΜ

Slide 33

Slide 33 text

༨ஊ: ͦ΋ͦ΋Զ͸includesࣗମ ͕ݏ͍ͩ • Q: Recipe.includes(:steps).foo_scope.to_a ͸stepsͱJOIN͢Δ͔?

Slide 34

Slide 34 text

༨ஊ: ͦ΋ͦ΋Զ͸includesࣗମ ͕ݏ͍ͩ • Q: Recipe.includes(:steps).foo_scope.to_a ͸stepsͱJOIN͢Δ͔? • A: Θ͔Βͳ͍ • foo_scopeͷఆٛʹΑΔ

Slide 35

Slide 35 text

·ͱΊ • Ruby 2.3 ͱ Rails 5.0 Λ࢖͏ͱerb͕଎͘ͳΔ • default_scope͸όάͬͯΔ͠ϝϯς͞Εͳ͍ • includesͷ࢖͍ํΛݟ௚ͯ͠ཉ͍͠ • AR::Baseͷੜ੒ίετʹؾΛ͚ͭΑ͏