ࠓ͢͜ͱ
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
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
ରࡦ
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