Slide 1

Slide 1 text

API ࣌୅ͷ Rails @morygonzalez at Fukuoka.rb #107

Slide 2

Slide 2 text

ࣗݾ঺հ • @morygonzalez • pyama YAMAP ͱ͍͏ձࣾͰ Rails Τϯ δχΞΛ͍ͯ͠·͢ • ৭ؾΛग़ͯ͠Πϯϑϥ΋΍͍ͬͯ·͢ @morygonzalez at Fukuoka.rb #107

Slide 3

Slide 3 text

@morygonzalez at Fukuoka.rb #107

Slide 4

Slide 4 text

Mobile ΞϓϦ͋Δ͠ F/E ͷਓ͸ Nuxt.js ͱ͔࢖͍͕ͨΔͷͰແཧͰ ͢ ! @morygonzalez at Fukuoka.rb #107

Slide 5

Slide 5 text

Client ͕ Rails way ʹࡌͬͯ͘Εͳ͍ • iOS ΞϓϦ • Android ΞϓϦ • Web F/E Client ͕౤͛ͯ͘Δ params ͕ ActiveRecord ͕ظ଴͢Δ͔ͨͪͰདྷ Δͱ͸ݶΒͳ͍ɻ @morygonzalez at Fukuoka.rb #107

Slide 6

Slide 6 text

Majestic Monolith ™ ࣌୅ͷ Rails • View ·Ͱ Rails Ͱ࡞Δ͜ͱ͕લఏ • View ͔Β͸ ActiveRecord ͕ѻ͍͠΍͍͢ Parameter ͔͠΍ͬͯ ͜ͳ͍ • Model ʹϦΫΤετύϥϝʔλʔΛͦͷ··஫ೖͯ͠΋໰୊ͳ ͍ @morygonzalez at Fukuoka.rb #107

Slide 7

Slide 7 text

ղܾํ๏ @morygonzalez at Fukuoka.rb #107

Slide 8

Slide 8 text

params ͍͍ײ͡ʹͯ͘͠ΕΔ܅ Client ͕౤͛ͯ͘Δ params Λ ActiveRecord ͕ཉ͍͔ͨͪ͠ʹม׵ ͯ͘͠ΕΔΫϥε͕͋Δͱศརɻ͓͠ΌΕʹݴ͏ͱ Form Object ͱ͍͏΍ͭɻ @morygonzalez at Fukuoka.rb #107

Slide 9

Slide 9 text

ղܾࡦ 1 • ฐࣾͰ͸ app/parameters/ σΟϨΫτϦΛ۷ͬͯ UserParameter Έ͍ͨͳΫϥεΛఆٛ͠ɺͦ͜ͰΑ͠ͳʹ ΍Δ͜ͱʹ͠·ͨ͠ɻ • StrongParameter Ͱ΍Δ͜ͱͷ͍ͭͰʹϦΫΤετϘσΟΛ ActiveRecord ͕ظ଴͢Δ͔ͨͪʹม͑ͪΌ͏ ʢ Client ͕౤͛ͯ͘Δ͍Βͳ͍৘ใ͸ࣺͯΔʣ class UserParameter < ApplicationParameter attr_parameter :name, :email, :password, :provider, :oauth_token, :device_id, :code, :redirect_uri def oauth_token @params[oauth_config&.token_field_name&.to_sym] end private def oauth_config return unless @params[:provider] Settings.oauth.send(@params[:provider]) end end @morygonzalez at Fukuoka.rb #107

Slide 10

Slide 10 text

ղܾࡦ 2 ଞʹ΋ྺ࢙తͳࣄ৘Ͱ࿦ཧ࡟আ΍ͬͯͨΓ Collection ΦϒδΣΫτ ͷߋ৽Λ͢΂ͯ DELETE INSERT ʹͨ͠Γ͠ͳ͍ͱ͍͚ͳͯ͘ɺ͢ ΂ͯͷҋΛٵऩ͢Δ AcceptNestedAttributesCustamizable ͱ ͍͏΍͹໊͍લͷϞδϡʔϧ΋͋Γ·͢… @morygonzalez at Fukuoka.rb #107

Slide 11

Slide 11 text

Partial Cache Ͱ͓஡Λ୙ͤͳ͍ @morygonzalez at Fukuoka.rb #107

Slide 12

Slide 12 text

Majestic Monolith ™ ࣌୅ͷ Rails • ! ʮ͜͜ͷ͜·͍෦෼ͷ৘ใΛදࣔ͢ΔͨΊʹεϩʔΫΤϦ͕ ग़ͪΌ͏ͳʙʯ • " ʮύʔγϟϧΩϟογϡͰΑ͘Ͷʁʯ গʑεϩʔΫΤϦ͕ग़ͯ͠·ͬͨͱͯ͠΋ύʔγϟϧΩϟογϡ ʢ View ͷ෦෼Ωϟογϡʣʹಀ͛Δ͜ͱͰ͓஡Λ୙͢͜ͱ͕Ͱ͖ ͨɻ @morygonzalez at Fukuoka.rb #107

Slide 13

Slide 13 text

API ࣌୅ͷ Rails • ! ʮ͜͜ͷ͜·͍෦෼ͷ৘ใΛදࣔ͢ΔͨΊʹεϩʔΫΤϦ͕ ग़ͪΌ͏ͳʙʯ • " ʮrender :json ͢Δͱ͖Ωϟογϡ͢Δͱ͔ਖ਼ؾͰ͢ ͔ʁʯ ActiveModel Serializer ͳͲΛ࢖͍ Rails ͸ϞσϧͷσʔλΛγϦΞ ϥΠζ͢Δ܅ͱԽͯ͠͠·ͬͨͷͰ View ͷ෦෼Ͱద౰ʹΩϟο γϡ͢Δ͜ͱ͕Ͱ͖ͳ͍ɻ @morygonzalez at Fukuoka.rb #107

Slide 14

Slide 14 text

ྫ͑͹ Kaminari ͷ COUNT ݁ՌΛ Ωϟογϡ͢Δ @morygonzalez at Fukuoka.rb #107

Slide 15

Slide 15 text

Kaminari ͱ͸ʁ • ϖʔδωʔγϣϯͷ gem ʹ༗໊ͳ gem Ͱ͢ • API ࣌୅Ͱ΋ݱ໾Ͱɺ JSON ʹ meta ৘ใͱͯ͠ϖʔδωʔγϣ ϯ݁ՌΛ͚ͬͭͨ͘Γ͠·͢ @morygonzalez at Fukuoka.rb #107

Slide 16

Slide 16 text

Kaminari ͕ग़͢ COUNT จ͕஗͍໰୊ • Ͱ͔͍ςʔϒϧʹରͯ͠࢖͏ͱ COUNT จ͕஗͘ͳΔͱ͍͏ݱ৅ ͕͋Γɺ Issue ͕੝Γ্͕ͬͯ· • paginate calls slow COUNT query for large sets (when it might not need to) · Issue #545 · kaminari/kaminari @morygonzalez at Fukuoka.rb #107

Slide 17

Slide 17 text

๻͸͜͏ͨ͠οε Controller Ͱ render :json ͢Δͱ͖ʹ :cache_total_count Φϓ γϣϯΛड͚औΕΔΑ͏ʹͯ͠ɺΩϟογϡ͢Δ͔൱͔ΛܾΊ Δɻ def index activities = policy_scope(Activity.active).published.with_relations.order(id: :desc) render json: activities, paginate: true, cache_total_count: true end @morygonzalez at Fukuoka.rb #107

Slide 18

Slide 18 text

๻͸͜͏ͨ͠οε ंྠͷ࠶ൃ໌ײ͋Δ Paginator ΫϥεΛ࡞੒ ͠ɺ :cache_total_count ͷϑϥάΛݟͯ Rails.cache ʹ஗͍ ΫΤ Ϧ Λग़͢ total_count ͷ݁ՌΛΩϟογϡͨ͠ΓऔΓग़ͨ͠Γ͢ Δɻ ৄ͘͠͸ϒϩάʹॻ͖·ͨ͠ͷͰ͝ཡԼ͍͞ɻ Kaminari ͕ൃߦ͢Δ஗͍ COUNT ΫΤϦͷ݁ՌΛΩϟογϡ͢Δ - portal shit! @morygonzalez at Fukuoka.rb #107

Slide 19

Slide 19 text

·ͱΊ • ࢒೦ͳ͕Β Rails ͸ API ࣌୅ʹͳͬͯҎલ΄ͲศརͰ͸ͳ͘ͳͬ ͨ gem Λ͍͔ͭ͘ೖΕͨΒԿͱͳ͘࡞Εͯͨ࣌୅͸ऴΘͬͨͬΆ ͍ • ͱ͸͍͑ Ruby ͷ Productivity ͸࠷ߴͰ͢ʢΩϝΔͱؾ͍࣋ͪ ͍ʣ • ࣃΛ৯͍͠͹ͬͯؤுΓ·͠ΐ͏ @morygonzalez at Fukuoka.rb #107