Slide 1

Slide 1 text

3BJMTΛ೥ؒ΍͖ͬͯͨ΅͕͘ ࠷ۙ3BJMTͰϋϚͬͨ͜ͱ 3BJMT%FWFMPQFST.FFUVQ ,B[VNB4V[VLJ

Slide 2

Slide 2 text

ࣗݾ঺հ w ླ໦࿨ਅʢ!LB[VNBYʣ w ܦྺ w ɹΧΧΫίϜೖࣾ w ʙ৯΂ϩάʢ3BJMTʙʣ w ʙΩφϦϊ w झຯ w ཱྀ !"#$%&'()*+,-./0123456789:;<=>?@

Slide 3

Slide 3 text

wʮ฻Β͠Λૉఢʹஸೡʹɻʯ ΛςʔϚʹͨ͠ϥΠϑελΠϧ ϝσΟΞɺ&$Ϟʔϧ w݄ؒ ສ66 w୅ޙ൒ʙ୅ঁੑ͕ϝΠϯ λʔήοτ

Slide 4

Slide 4 text

ࠓ೔࿩͢͜ͱ w ͜͜Ұ೥͘Β͍Ͱ3BJMTͰϋϚͬͨ͜ͱ w ࣮ࡍʹ͓͋ͬͨ࿩Ͱ͢ w ؆୯Ͱ౰ͨΓલͷ಺༰͕ଟ͍Ͱ͢ w طʹ஌ͬͯΔ಺༰΋͋Δ͔΋͠Ε·ͤΜ͕ɺօ͞Μ͕ϋϚͬ ͨ࣌ʹগ͠Ͱ΋͓໾ʹཱͯ͹޾͍Ͱ͢ w 3BJMT 3VCZͰݕূ

Slide 5

Slide 5 text

$BTF̍ ΧϥϜ௥Ճ࣌ʹ JOEFY͕͸ΒΕͳ͍

Slide 6

Slide 6 text

w BSUJDMFTςʔϒϧΛ࡞੒ ࣄྫ class CreateArticles < ActiveRecord::Migration def change create_table :articles do |t| t.string :title, null: false t.integer :user_id, null: false, index: true end end end

Slide 7

Slide 7 text

w BSUJDMFTςʔϒϧʹDBUFHPSZ@JEΛ௥Ճ ࣄྫ class AddCategoryIdToArticles < ActiveRecord::Migration def change add_column :articles, :category_id, :integer, null: false, index: true end end

Slide 8

Slide 8 text

JOEFY͕͸ΒΕ͍ͯͳ͍ʜʁ

Slide 9

Slide 9 text

ݪҼ w ͦ΋ͦ΋BEE@DPMVNOʹ͸JOEFYΦϓγϣϯ͕ͳ͔ͬͨ w վળͷ13Λൃݟ IUUQTHJUIVCDPNSBJMTSBJMTQVMM

Slide 10

Slide 10 text

lBEE@DPMVNO͸ΧϥϜΛ௥Ճ͢Δ͚ͩͷ%4-Ͱ͢ɻJOEFYΛ௥Ճ͢ Δ৔߹͸ผͷ%4-͕͋Γ·͢ɻզʑ͸͜ΕΒͷ%4-ΛՄೳͳݶΓ ͖Ε͍Ͱ໌֬ͳ΋ͷʹ͓͖͍ͯͨ͠ͱߟ͍͑ͯ·͢ɻͦ͏͠ͳ͍ͱ ༷ʑͳόϦΤʔγϣϯશͯΛҡ࣋͢Δ͜ͱ͕Ͱ͖ͳ͘ͳΓ·͢ɻz

Slide 11

Slide 11 text

w ΧϥϜ௥Ճ࣌ʹJOEFYΛ௥Ճ͢Δࡍ͸BEE@JOEFYΛ࢖͏ ରࡦ class AddCategoryIdToArticles < ActiveRecord::Migration def change add_column :articles, :category_id, :integer, null: false add_index :articles, :category_id end end

Slide 12

Slide 12 text

$BTF
 USZͷ᠘

Slide 13

Slide 13 text

w ΦϒδΣΫτ͕OJMͰͳ͍৔߹ͷΈϝιουΛ࣮ߦ͠ɺɹ ɹ OJMͷ৔߹͸Կ΋͠ͳ͍ USZͱ͸ user = nil #=> nil user.writer? # NoMethodError: undefined method `writer?' for nil:NilClass user.try(:writer?) #=> nil class NilClass def try(*args) nil end ... end BDUJWFTVQQPSUMJCBDUJWF@TVQQPSUDPSF@FYUPCKFDUUSZSC

Slide 14

Slide 14 text

w Ϣʔβʔ͕ϥΠλʔ͔Ͳ͏͔Λ൑ఆ ࣄྫ user = User.first #=> # user.writer? #=> true if user.try(:writter?) 'Ϣʔβʔ͸ϥΠλʔͰ͢ɻ' else 'Ϣʔβʔ͸ଘࡏ͠ͳ͍͔ϥΠλʔͰ͸͋Γ·ͤΜɻ' end #=> "Ϣʔβʔ͸ଘࡏ͠ͳ͍͔ϥΠλʔͰ͸͋Γ·ͤΜɻ"

Slide 15

Slide 15 text

Ϣʔβʔ͸ଘࡏͯ͠Δ͠ɺ ϥΠλʔͳ͸ͣͳͷʹͳͥʜ

Slide 16

Slide 16 text

w ʮUSZʯ͸ϝιου͕ͳ͍৔߹ʢUZQPͳͲʣ΋ྫ֎Λग़͞ ͣʹOJMΛฦ͢ ݪҼ module ActiveSupport module Tryable def try(*a, &b) try!(*a, &b) if a.empty? || respond_to?(a.first) end ... end end class Object include ActiveSupport::Tryable end ... BDUJWFTVQQPSUMJCBDUJWF@TVQQPSUDPSF@FYUPCKFDUUSZSC

Slide 17

Slide 17 text

w ʮUSZʯΛ࢖͏ w ΅ͬͪԋࢉࢠʮʯΛ࢖͏ʢ3VCZʙʣ ରࡦ user.try(:writter?) #=> nil user.try!(:writter?) # NoMethodError: undefined method `writter?' for # # Did you mean? writer? user&.(:writter?) # NoMethodError: undefined method `call' for #

Slide 18

Slide 18 text

$BTF
 GSBHNFOUDBDIF͕ ΫϦΞ͞Εͳ͍

Slide 19

Slide 19 text

GSBHNFOUDBDIFͱ͸ w 7JFXͷҰ෦෼ΛΩϟογϡ͢Δػೳ w Ωϟογϡͷ৚݅΍ظݶΛݸผʹઃఆͰ͖Δ w ΦϒδΣΫτ΍)5.-͕มߋ͞ΕΔͱߋ৽͞ΕΔ <% cache @article, expires_in: 5.minutes do %> ɹɹΩϟογϡ͍ͨ͠HTML <% end %> WJFXTBSUJDMFTEEDBGCDCD⒎FF BSUJMDMF@JE BSUJMDMFͷVQEBUFE@BU Ωϟογϡ͞ΕΔϏϡʔϑϥάϝϯτͷ ಺༰͔Βࢉग़͞Εͨ.%ϋογϡ ੜ੒͞ΕΔΩʔ

Slide 20

Slide 20 text

w هࣄϖʔδͰϑϥάϝϯτΩϟογϡΛར༻ ࣄྫ BQQWJFXTBSUJDMFTTIPXIUNMTMJN - cache @article, expires_in: 5.minutes do ... = render 'common_partial' ... BQQWJFXTBQQMJDBUJPO@DPNNPO@QBSUJBMIUNMTMJN p | ڞ௨ͷύʔγϟϧͰ͢ɻ p | ڞ௨ͷύʔγϟϧͩΑʂ มߋ

Slide 21

Slide 21 text

Ωϟογϡ͕ΫϦΞ ͞Εͳ͍ɻɻ

Slide 22

Slide 22 text

w UFNQMBUF͕ݟ͔ͭΒͳ͍ͷͰμΠδΣετ͕ܭࢉͰ͖ͣ ΩϟογϡΛߋ৽͢Δ͔Ͳ͏͔ͷ൑ఆ͕Ͱ͖ͳ͍ ݪҼ 3FOEFSJOHBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO $PVMEOUpOEUFNQMBUFGPSEJHFTUJOHBSUJDMFTDPNNPO@QBSUJBM 3FBEGSBHNFOUWJFXTBSUJDMFTEEDBGCDCD⒎FF NT 3FOEFSFEBQQMJDBUJPO@DPNNPO@QBSUJBMIUNMTMJN NT 8SJUFGSBHNFOUWJFXTBSUJDMFTEEDBGCDCD⒎FF NT 3FOEFSFEBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO NT 3FOEFSJOHBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO $PVMEOUpOEUFNQMBUFGPSEJHFTUJOHBSUJDMFTDPNNPO@QBSUJBM 3FBEGSBHNFOUWJFXTBSUJDMFTEEDBGCDCD⒎FF NT 3FOEFSFEBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO NT มߋલ มߋޙ

Slide 23

Slide 23 text

ରࡦ w BQQWJFXTBQQMJDBUJPO഑ԼͷύʔγϟϧΛSFOEFS͢Δ ࡍ͸ύεΛলུ͠ͳ͍ w ಈతʹύʔγϟϧͷύεΛੜ੒͢Δ৔߹ʹ΋ى͜ΓಘΔͷ Ͱ஫ҙ BQQWJFXTBSUJDMFTTIPXIUNMTMJN - cache @article, expires_in: 5.minutes do ... = render 'application/common_partial' ...

Slide 24

Slide 24 text

Ωϟογϡ͕ΫϦΞ͞ΕΔ 3FOEFSJOHBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO 3FBEGSBHNFOUWJFXTBSUJDMFTCGDEC NT 3FOEFSFEBQQMJDBUJPO@DPNNPO@QBSUJBMIUNMTMJN NT 8SJUFGSBHNFOUWJFXTBSUJDMFTCGDEC NT 3FOEFSFEBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO NT 3FOEFSJOHBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO 3FBEGSBHNFOUWJFXTBSUJDMFTFFGECDD NT 3FOEFSFEBQQMJDBUJPO@DPNNPO@QBSUJBMIUNMTMJN NT 8SJUFGSBHNFOUWJFXTBSUJDMFTFFGECDD NT 3FOEFSFEBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO NT มߋલʢΩϟογϡͳ͠ʣ มߋޙ 3FOEFSJOHBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO 3FBEGSBHNFOUWJFXTBSUJDMFTCGDEC NT 3FOEFSFEBSUJDMFTTIPXIUNMTMJNXJUIJOMBZPVUTBQQMJDBUJPO NT มߋલʢΩϟογϡ͋Γʣ

Slide 25

Slide 25 text

ϓν৘ใᶃ w 3BJMT͔Β͸ʮSBJMTEFWDBDIFʯίϚϯυ͕௥Ճ͞Εͯ ؆୯ʹΩϟογϡ0/0''Λ੾Γସ͑ΕΔΑ͏ʹͳͬͨ config.action_controller.perform_caching = true 3BJMT $ bin/rails dev:cache Development mode is now being cached. 3BJMT DPOpHFOWJSPONFOUTEFWFMPQNFOUSCΛҎԼͷΑ͏ʹฤूͯ͠ɺαʔό࠶ىಈ ҎԼͷίϚϯυΛୟ͘ͱɺUNQDBDIJOHEFWUYU͕ੜ੒͞Εͯαʔό΋࠶ىಈ͞ΕΔ

Slide 26

Slide 26 text

w GSBHNFOUDBDIFͷ৘ใΛϩάʹද͍ࣔͨ͠৔߹͸ɺɹɹ ҎԼͷઃఆΛߦ͏ ϓν৘ใᶄ Rails.application.configure do ... config.action_controller.enable_fragment_cache_logging = true ... end DPOpHFOWJSPONFOUTEFWFMPQNFOUSC

Slide 27

Slide 27 text

$BTF ৽ن࡞੒ը໘ʹ໭ͬͨΒ ࡞੒ͨ͠͸ͣͷ Ϩίʔυ͕ফ͑ͨ

Slide 28

Slide 28 text

w هࣄʹରͰඥ෇͘0(1৘ใΛ࡞੒ ࣄྫ

Slide 29

Slide 29 text

.PEFM class Article < ApplicationRecord has_one :ogp_info, dependent: :destroy ... end class OgpInfo < ApplicationRecord belongs_to :article ... end BQQNPEFMTBSUJDMFSC BQQNPEFMTPHQ@JOGPSC

Slide 30

Slide 30 text

$POUSPMMFS class OgpInfosController < ApplicationController before_action :set_article def new @ogp_info = @article.build_ogp_info end def create @ogp_info = @article.build_ogp_info(ogp_info_params) if @ogp_info.save redirect_to article_ogp_info_url(@article), notice: 'OGP৘ใΛ࡞੒͠·ͨ͠ɻ' else render :new end end ... private def set_article @article = Article.find(params[:article_id]) end end

Slide 31

Slide 31 text

ϒϥ΢βόοΫͰ৽ن࡞੒ϖʔδʹ ໭ͬͨΒ࡞੒ͨ͠Ϩίʔυ͕ফ͑ͨɻɻ

Slide 32

Slide 32 text

w IBT@POFʹEFQFOEFOUEFTUSPZ͕෇͍͍ͯΔͱɺ CVJME@YYY࣌ʹϨίʔυ͕࡟আ͞ΕΔ ݪҼ article = Article.first #=> # ogp_info = article.build_ogp_info(title: 'hoge') #=> # ogp_info.save #=> true article.ogp_info #=> # ogp_info = article.build_ogp_info(title: 'fuga') # (0.3ms) BEGIN # SQL (0.5ms) DELETE FROM `ogp_infos` WHERE `ogp_infos`.`id` = 23 # (1.8ms) COMMIT #=> # article.reload.ogp_info #=> nil

Slide 33

Slide 33 text

ରࡦ w OFXΞΫγϣϯͰCVJME@YYYΛ࢖Θͳ͍Α͏ʹରԠ class OgpInfosController < ApplicationController before_action :set_article def new @ogp_info = OgpInfo.new end ... end

Slide 34

Slide 34 text

·ͱΊ w ࠷ۙ3BJMTͰϋϚͬͨ͜ͱΛ঺հ w ؆୯Ͱ౰ͨΓલͷ͜ͱͰ΋ҙ֎ͱ஌Βͳ͔ͬͨΓ͢Δ w ϋϚͬͨ࣌͸3BJMTͷίʔυ΍*TTVF 13Λ௥͍͔͚ͯΈΔ ͱษڧʹͳΔ

Slide 35

Slide 35 text

8FSF)JSJOH w 8FCΤϯδχΞɿ3VCZ 3BJMT w ΞϓϦΤϯδχΞɿ4XJGU ,PUMJO