$30 off During Our Annual Pro Sale. View Details »

Extending Rails for Real World App Development

Extending Rails for Real World App Development

Rails Developers Meetup 2019 の講演「毎日の開発に役立つRailsプラグインづくりの秘訣」のスライド https://railsdm.github.io/ #RailsDM

Akira Matsuda

March 22, 2019
Tweet

More Decks by Akira Matsuda

Other Decks in Programming

Transcript

  1. ຖ೔ͷ։ൃʹ໾ཱͭ
    RailsϓϥάΠϯ

    ͮ͘Γͷൿ݃
    @a_matsuda

    View Slide

  2. ࠷ॳʹ͓஌Βͤ


    View Slide

  3. View Slide

  4. RubyKaigiͷLTͷϓϩϙʔβϧड෇தʂ
    ໌ޙ೔·Ͱʂ

    View Slide

  5. RejectKaigiͷϓϩϙʔβϧ΋ืूதʂ
    ࠓ݄͍ͬͺ͍ʂ

    View Slide

  6. View Slide

  7. Asakusa.rb Ֆݟ΍Γ·͢ʂ

    དྷिͷ౔༵೔ʂ

    View Slide

  8. ࠓ೔࿩͢͜ͱ

    ൺֱత࠷ۙ࡞ͬͨgemͷ࿩

    ͋Δ͍͸

    ਓ͸ͳͥgemΛ࡞Δͷ͔

    View Slide

  9. ࠓ೔࿩͢͜ͱ

    ͦΕ͔Βɺ

    View Slide

  10. ࠓ೔࿩͢͜ͱ

    ςετίʔυ͕։ൃΛ

    υϥΠϒ͢Δ࿩

    View Slide

  11. ࠓ೔࿩͞ͳ͍͜ͱ

    action_args

    active_decorator

    database_rewinder

    gem_src

    i18n_generators

    jb

    kaminari

    motorhead

    rfd

    stateful_enum

    string_template

    traceroute

    ...

    View Slide

  12. Question

    View Slide

  13. Կ͔࣮༻ϨϕϧͷgemΛࣗ෼Ͱ࡞ͬͯ

    ϦϦʔεͯ͠Έͨ͜ͱ͕͋Δਓ ✋

    View Slide

  14. ͍·खΛڍ͛ͯͳ͍ਓͨͪʹ

    ݴ͍͍ͨ

    View Slide

  15. Why Don't You Create

    Your Own Gems?

    View Slide

  16. ͳͥgemΛ࡞Βͳ͍ͷ͔ʁ

    ·ͨ͸ɺਓ͸ͳͥgemΛ

    ࡞Δͷ͔ʁ

    View Slide

  17. ๻ͷ৔߹͸ɺ΄΅100%

    ʮݱ৔ͷ໰୊Λղܾ͢ΔͨΊʯ

    View Slide

  18. Case #1

    View Slide

  19. ݱ৔ͷ໰୊

    ςετ͸΋ͪΖΜॻ͔ͳͬͪ͘Ό͋

    ͍͚ͳ͍

    Ͱ΋E2Eςετॻ͘ͷΊΜͲ͍

    ߲໨͕૿͖͑ͯͨΓ͢ΔͱͭΒ͍

    View Slide

  20. ͖͔͚ͬ

    View Slide

  21. ͖͔͚ͬ

    View Slide

  22. ͖͔͚ͬ

    ৽نϓϩδΣΫτΛ࢝ΊΔʹ͋ͨͬͯɺ
    E2Eςετͱ͔͋Μ·Γॻ͍ͨ͜ͱ

    ͳ͍͍ͬͯ͏ए͍ϝϯόʔ΋ډͨ

    ୭Ͱ΋ςετ͕αΫαΫͬͱॻ͚Δͱ

    ͍͍ͳ͊ɺͱࢥͬͯ࡞ͬͯΈͨ

    View Slide

  23. heavens_door

    View Slide

  24. ͜ͷgemΛ࡞Δʹ͋ͨͬͯ

    ؾΛ͚ͭͨ͜ͱ

    ͱʹ͔͘୯ػೳʹ͢Δ

    View Slide

  25. ϒϥ΢βͷૢ࡞Λه࿥ͯ͠Capybaraͷ
    γφϦΦΛ࡞ΔϓϥάΠϯ

    ͘͢͝௚ײత

    View Slide

  26. ࢖͍ํ͸READMEʹషͬͨΞχϝgifΛ
    ݟΕ͹͙͢Θ͔ΔͷͰɺઆ໌͸লུ

    View Slide

  27. heavens_door

    https:/
    /github.com/
    amatsuda/heavens_door

    View Slide

  28. ͱ͜ΖͰɺ

    View Slide

  29. ͝هԱͷํ΋Կ໊͔͍Βͬ͠Όͬͨ
    Α͏Ͱ͕͢ɺ

    View Slide

  30. ࣮͸ɺ͜ͷίϯηϓτ͸શવ

    ৽͘͠ͳͯ͘ɺ

    View Slide

  31. ͸Δ͔ੲʹhocus_pocusͰ

    Ұ౓΍ͬͨ͜ͱͷম͖௚͠

    View Slide

  32. Case #2

    View Slide

  33. hocus_pocus

    ྺ࢙ͷڱؒʹຒ΋ΕͨΦʔύʔπ

    ௒ଟػೳͳϒϥ΢β಺౷߹։ൃ

    ؀ڥΈ͍ͨͳ΋ͷΛ໨ࢦͨ͠

    View Slide

  34. ͜Ε͸ɺԿ͔ղܾ͍ͨ͠໰୊͕͋ͬͨͱ͍͏ΑΓ͸ɺ
    ࡞Εͦ͏ͳؾ͕͔ͨ͠Β࡞Γ࢝ΊͯΈͨɺͱ͍͏ײ͡

    View Slide

  35. hocus_pocusͷߏ଄

    main_appʹmount͞Εͨhocus_pocus

    Τϯδϯ͕͞Βʹ4ͭͷαϒmountable engine
    Λmountͯ͠Δͱ͍͏ແବʹෳࡶͳߏ੒

    ౰࣌ੈքॳͩͬͨ͸ͣͩ͠ɺͨͿΜະͩʹ

    ͦΜͳengine͸ଞʹແ͍ͷͰ͸ͳ͍͔

    View Slide

  36. hocus_pocusͷࢥ૝

    "resource missing" driven
    development

    ϖʔδ಺ʹWikiNameΛॻ͍ͨΒɺ

    ৽͍͠Wikiϖʔδ΁ͷϦϯΫʹͳͬͯ͘

    ͋ͷײ͡

    View Slide

  37. ͱ͔2019೥ʹݴͬͯ΋ɺ͋Μ·Γ

    ఻ΘΒͳͦ͏ͳͷͰ

    View Slide

  38. ͓Αͦ7೥ͿΓʹDEMO

    View Slide

  39. 7೥લ

    View Slide

  40. hocus_pocus

    https:/
    /github.com/
    amatsuda/hocus_pocus

    View Slide

  41. 9೥લʹ࡞Γ࢝Ίͨ΍ͭ

    ·ͬͨ͘ྲྀߦΒͳ͔ͬͨ

    ͱ͍͏͔׬੒͢Β͠ͳ͔ͬͨ

    View Slide

  42. hocus_pocusͷͦͷޙ

    ૖େͳߏ૝͸৭ʑ͚͋ͬͨͲɺ

    ΍Δؾ͕࣋ଓͤͣʹdiscon

    View Slide

  43. ΋͏ͪΐ͍׬੒౓͕ߴ͘ͳͬͨΒυΩϡϝϯτ

    ͱ͔΋ͪΌΜͱॻ͜͏ɺͱࢥͬͯͨ

    ͚ͲɺͦΜͳ೔͸དྷͳ͔ͬͨ

    View Slide

  44. ͔͜͜Βಘͨڭ܇

    ݱ৔ͷ໰୊υϦϒϯ͡Όͳ͍झຯͷ։ൃ͸Ϟνϕʔ
    γϣϯͷҡ͕࣋೉͍͠

    খ͘͞࡞ͬͯૣΊʹϦϦʔεɺ͕΍ͬͺΓେࣄ

    υΩϡϝϯςʔγϣϯେࣄ

    ͦ΋ͦ΋࢖͍ํ͕೉͗͢͠Δπʔϧ͸࢖ͬͯ΋Β͑

    ͳ͍

    View Slide

  45. খ͘͞࡞ͬͯૣΊʹϦϦʔεɺ

    ͕΍ͬͺΓେࣄ

    ࢥ͍͍ͭͨΞΠσΞ͸͙͢ʹ࣮૷
    Ͱ͖ΔαΠζ͡Όͳ͍ͱɺͳΜ
    ͔ͩͬͨ๨ΕΔ

    View Slide

  46. υΩϡϝϯςʔγϣϯ

    େ࡞ͳgem͸υΩϡϝϯτΛॻ͘

    োน͕ߴ͍

    ͦ͏͍͏ҙຯͰ΋ػೳ͸গͳ͍

    ΄͏͕ྑ͍

    View Slide

  47. ͦ΋ͦ΋࢖͍ํ͕೉͗͢͠Δπʔϧ
    ͸࢖ͬͯ΋Β͑ͳ͍

    ίϯηϓτ͕ಛघͩͬͨΓ͢Δ
    ͱɺ఻ΘΒͣʹऴΘΔ

    View Slide

  48. hocus_pocusͰͷࣦഊΛ׆͔ͯ͠
    heavens_doorͰ΍ͬͯΈͨ͜ͱ

    View Slide

  49. Ξχϝgif

    View Slide

  50. Ξχϝgif͍͢͝

    View Slide

  51. ʮݴ༿ʯͰͳ͘ʮ৺ʯͰ

    ཧղͰ͖Δʂ

    View Slide

  52. Ͱ΋ɺ͜ͷϝιου͕ద༻Ͱ͖ΔRuby
    ͷϥΠϒϥϦ͸ͦΜͳʹଟ͘ͳ͍͔΋ʁ

    ࣮ࡍɺࣗ෼͕࡞ͬͨଞͷϥΠϒϥϦͰ͜ͷϝιου

    ͕׆༻Ͱ͖Δ͔Ͳ͏͔ߟ͑ͯΈ͚ͨͲɺ࣮ࡍͳ͔ͳ͔

    νϟϯε͸ͳͦ͞͏

    ͯͳΘ͚ͰɺRubyͷϥΠϒϥϦΑΓ΋JSͱ͔ͷ

    ϥΠϒϥϦͷํ͕⭐ΛूΊ΍ͦ͢͏ɺ͍ͬͯ͏࿩͸

    ͋ΔΜͩΑͳ͊

    View Slide

  53. ͱ͜ΖͰɺ͜ͷϒϥ΢β಺ͰΞϓϦ
    Λ։ൃ͍ͯ͘͠ͱ͍͏ίϯηϓτ

    2019೥ʹͳͬͯɺ͋ͷ”conductor”͕
    ੝Γ্͕ΓΛݟͤΔػӡ

    ͜Ε͔Β·ͩ·ͩՄೳੑͷ͋Δ෼໺

    ͳͷͰ͸

    View Slide

  54. ͦ͜Ͱɺϒϥ΢βͰԿ͔͢Δ΍ͭΛ

    ΋͏1ͭ

    View Slide

  55. Case #3

    View Slide

  56. ݱ৔ͷ໰୊

    ERਤ͕ݟ͍ͨʂ

    View Slide

  57. ݱ৔ͰERਤݟ͍ͨͰ͢ΑͶʁ

    ͨͱ͑͹ͪΐͬͱΤϯλʔϓϥΠ
    ζͬΆ͍Ҋ݅ʹ్த͔Βࢀըͨ͠
    ࣌ͱ͔

    View Slide

  58. ͦ͜Ͱerd

    RailsΞϓϦʹmountͯ͠࢖͏
    engine

    ਌ΞϓϦͷERਤΛϒϥ΢β಺ʹදࣔ

    ͍ͭͰʹૢ࡞

    View Slide

  59. ૢ࡞ʁ

    create tableͱ͔alter tableͱ͔

    migrationΛ࡞੒ɺ࣮ߦ

    migrationͷॻ͖ํΛ֮͑ΒΕͳ͍/ࢥ͍ग़ͤͳ͍

    ਓʹ͓͢͢Ί

    migration ͕ʮݴ༿ʯͰͳ͘ʮ৺ʯͰ(ry

    View Slide

  60. DEMO

    View Slide

  61. Status of erd

    ͥΜͥΜະ׬੒

    UI͕͍Ζ͍ΖϏϛϣʔ

    ΋ͬͱϒϥογϡΞοϓ͍ͨ͠ؾ࣋ͪ͸͋Δ͚ͲJSॻ͘ͷ

    ͠ΜͲ͍

    coffeeͰࡶʹॻ͍ͯdecafͨ͠ίʔυ͕΋͸΍ϝϯςෆೳϨϕϧ

    ୭͔JS͕ಘҙͳํɺॿ͚͍ͯͩ͘͞ʂʂʂʂ(੾࣮)

    View Slide

  62. erd

    https:/
    /github.com/
    amatsuda/erd

    View Slide

  63. ͯ͞ɺ࿩͸มΘͬͯɺϒϥ΢β্ͰΤϯϓϥ

    ͬΆ͍ਤΛදࣔ͢ΔengineΛ΋͏1ͭ

    View Slide

  64. Case #4

    View Slide

  65. ݱ৔ͷ໰୊

    ࠓ౓͸ը໘ભҠਤ͕ݟ͍ͨʂ

    View Slide

  66. ͜Ε΋ݱ৔ͷ੾࣮ͳ໰୊

    routes.rb ΛݟΕ͹Ϧιʔεͷ

    Ұཡ͸Θ͔Δ

    Ͱ΋ͭͳ͕Γ͸ݟ͑ͳ͍

    View Slide

  67. ΍ͬͺը໘ભҠਤ

    View Slide

  68. ίϯηϓτ

    ը໘ભҠਤͬͯੲ͸ΈΜͳखඳ͖
    ͯͨ͠΋ͷ͚ͩͲɺߟ͑ͯΈͨΒ
    ͜Εͬͯੜ੒Ͱ͖ΔΜ͡Όͳ͍
    ͔ʁ

    View Slide

  69. roundabout

    View Slide

  70. DEMO

    View Slide

  71. ΍ͬͯΔ͜ͱ

    E2Eςετ಺Ͱ࣮ߦ͞Εͨը໘

    ભҠΛશͯه࿥

    ͦͷ݁ՌΛਤࣔ

    View Slide

  72. ͜Ε͕ԿΛද͍ͯ͠Δͷ͔

    ࣮ࡍʹ࣮૷͞Εͯͯςετ͞Εͯ
    ͍Δը໘ભҠΛه࿥

    ͨͩͷ routes.rb ͷਤࣔͱ͸ҧ͏

    View Slide

  73. ςετ͕ͪΌΜͱॻ͔Ε͍ͯΔ͔ͷ
    ֬ೝʹͳΔ

    ͋ΔҙຯΧόϨοδͷදࣔͷҰछ
    ͷΑ͏ͳ΋ͷͱݴ͑Δ͔΋

    View Slide

  74. ͜ͷgemͷΑ͞

    ॻ͍ͨςετ͕ܗΛม͑ͨࢿ࢈ʹ
    ͳΔͷ͕Α͍

    View Slide

  75. ࣍͸΋͏1ͭɺςετࢿ࢈Λ׆͔͢΍ͭ
    Λ͝঺հ

    View Slide

  76. Case #5

    View Slide

  77. ݱ৔ͷ໰୊

    RailsΞοϓάϨʔυͰσάϨ

    ͨ͘͠ͳ͍

    View Slide

  78. still_life

    View Slide

  79. still_lifeͰͰ͖Δ͜ͱ

    ςετΛ૸Βͤͨࡍʹɺςετத
    ʹrender͞ΕͨHTMLΛશ෦

    ϑΝΠϧʹॻ͖ग़͢

    View Slide

  80. ͍͢͝ྗٕͳϓϥάΠϯ

    View Slide

  81. ໨త

    ΞϓϦέʔγϣϯίʔυͷॻ͖׵͑

    લޙʹɺϢʔβʔʹಧ͚͍ͯΔ΋ͷ
    ͕มԽ͍ͯ͠ͳ͍͜ͱΛ֬ೝͰ͖Δ

    View Slide

  82. ಛ௃

    ը໘Λ౿ΜͰճΔ͚ͩͰྑͯ͘ɺ
    ΞαʔγϣϯΛॻ͔ͳͯ͘ྑ͍

    ͷͰָνϯ

    View Slide

  83. Ͳ͏͍͏࣌ʹ࢖͏ͷ͔

    ಛʹRailsͷΞοϓάϨʔυ͕

    ૝ఆ༻్

    Ұൠతʹ֤छϦϑΝΫλϦϯάͷ
    ࢧԉʹͳΔ͸ͣ

    View Slide

  84. ͦ΋ͦ΋ͷݩωλ

    2011೥ʹɺΫοΫύουͷRails
    ͷόʔδϣϯΛ্͛Δ࣌ʹηίϯ
    ͞Μ͕ॻ͖ࣺͯͨεΫϦϓτ

    View Slide

  85. https:/
    /speakerdeck.com/a_matsuda/the-recipe-
    for-the-worlds-largest-rails-monolith?slide=129

    View Slide

  86. cookpad

    View Slide

  87. ·͞ʹݱ৔ͷ໰୊Λత֬ʹղܾ͢Δ
    ৬ਓٕ

    View Slide

  88. gemԽʹ͋ͨͬͯɺҎԼͷશ໘αϙʔτ

    Λ௥Ճ

    Capybara 3

    RSpec 3

    test-unit

    minitest

    View Slide

  89. օ͞Μͷݱ৔Ͱ΋΋͏͖͡ Rails 5.2 -> 6.0
    ͷΞοϓάϨʔυۀ͕࢝·Δͱࢥ͍·͕͢ɺ

    ͔ͳΓ༗༻͔΋͠Εͳ͍ͷͰɺ

    Ͳ͏ͧ͝׆༻͍ͩ͘͞

    View Slide

  90. ͱ͜ΖͰɺ͜ͷϥΠϒϥϦͷओͳೳྗ͸

    ΞϓϦΛ͜͡։͚ͯಈ࡞Λه࿥͢Δελϯυ

    ͜ͷೳྗͬͯɺ͜Εͦ͜

    "heavens_door" ͡Ό͋Ͷ͔͑ʂ

    View Slide

  91. ͱࢥ͚ͬͨͲɺͦͷ໊લͷgem͸طʹ
    औΒΕͯ͠·͍ͬͯͨͷͰ͋ͬͨ

    View Slide

  92. ໊લॏཁ

    gemͷ໊લ͚ͭΔͷ೉͍͠……

    View Slide

  93. ͜ΕΛ8೥ӽ͠ͰgemԽ͖͔͚ͨͬ͠

    ࣗ࡞ςϯϓϨʔτΤϯδϯͷಈ࡞ݕূͷ
    ͨΊʹཉ͘͠ͳͬͨ

    ๭ΠϯλʔωοτՈܭ฽ͷRailsΞοϓ
    άϨʔυͷࡍʹ͜ΕͷଘࡏΛࢥ͍ग़ͨ͠

    View Slide

  94. Money Forward

    View Slide

  95. ʮࣗ࡞ςϯϓϨʔτΤϯδϯʯ

    View Slide

  96. Case #6

    View Slide

  97. Himl

    View Slide

  98. Himl

    ͖͔͚ͬ͸ɺӬ࿨γεςϜϚωδ
    ϝϯτͰຖ݄΍ͬͯΔOSSύον
    ձ

    View Slide

  99. ͷ͋ͱͷҿΈձ

    View Slide

  100. Ӭ࿨γεςϜϚωδϝϯτ

    View Slide

  101. kamipo͞Μͷ۪ஒ

    kamipo: ձࣾͰHaml࢖ͬͯΔ͚ͲɺHaml
    ͱ͔Slimͱ͔จ๏͕Ṗ֮͗ͯ͑͢ΒΕ΁Μ
    ΘɻERBͰྑ͘ͳ͍ʁ

    me: ͍΍ʔɺHaml௒͍͍ͬ͢ΑɻERBʹ໭
    Δͱ͔ϜϦϜϦɻ

    View Slide

  102. ͔͠͠ɺ͋ΒͨΊͯɺHamlͷྑͬͯ͞
    ͳΜͩΖ͏ʁ

    ͔֬ʹɺ͋ͷه߸ͨͪΛۦ࢖ͨ͠จ๏ࣗମ
    ͸Hamlͷྑ͞ͷຊ࣭Ͱ͸ͳ͍͔΋

    Hamlͷྑ͞͸ɺλάΛػց͕ดͯ͘͡ΕΔ
    ͓͔͛ͰɺίϯύΠϧ͞ΕͨHTML͕valid
    ͳ͜ͱ͕อূ͞ΕΔͱ͜Ζ

    View Slide

  103. ͡Ό͋ɺHamlͷྑ͞ΛERBʹ஫ೖͯ͠
    ΍Ε͹ྑ͍ͷͰ͸ʁ

    View Slide

  104. Αͦ͞͏ɺ͔΋͠Εͳ͍

    View Slide

  105. ͷͰ࡞ͬͯΈͨ

    View Slide

  106. Himl

    https:/
    /github.com/
    amatsuda/himl

    View Slide

  107. ࠓճͷݱ৔͸…

    ਆాͷͱ͋Δډञ԰

    View Slide

  108. Himlͷ։ൃΛ௨ͯ͡Θ͔ͬͨ͜ͱ

    View Slide

  109. ډञ԰ͩͬͯݱ৔ͳΜ΍ʂ


    View Slide

  110. ·ͱΊ

    View Slide

  111. ਓ͸ͳͥgemΛ࡞Δͷ͔ʁ

    ໰୊Λղͨ͘Ί

    View Slide

  112. ໰୊͸ͨ͘͞Μݱ৔ʹస͕ͬͯΔ

    View Slide

  113. ͜͏͍͏໰୊ͷղ͖ํ΋͍͍Μ͡Ό
    ͳ͍Ͱ͠ΐ͏͔ʁ

    ͳ͔ͳָ͔͍͠Ͱ͢Α

    View Slide

  114. Why Don't You Create Your Own
    Gems?

    gem࡞Ζʔͥʂ

    View Slide

  115. end

    View Slide

  116. me

    Name: Akira Matsuda

    Twitter: @a_matsuda

    GitHub: amatsuda

    View Slide