ͷιϦϡʔγϣϯͰͷΛղܾͰ͖Δ
w $P$ ઃఆΑΓن
ͰࡶͳઃఆϑΝΠϧΛল
ུ
w .PEFMͱςʔϒ
ϧͷಉҰࢹ "DUJWF3FDPSEύλʔ
ϯ
ͰϚοϐϯάΛγϯϓϧʹ
w ͳͲͳͲɾɾɾ3BJMTͷ͢Β͠͞ͷͻͱͭɺ
ͦͷେʹׂΓͬͨઃܭࢥ
Slide 13
Slide 13 text
͍ͬΆ͏ͰϨʔϧ͔Β֎ΕΔͱ͖͍ͭ
w ్ʹϋʔυϧ্͕͕Δ
w "ͦͦϨʔϧΛͣΕΔͷ͕ؒҧ͍ͬͯΔ
w ʮͷػೳʙʯΛߟ͑Δͱਖ਼
w ͚ΕͲɺن͕େ͖͘ͳͬͯ͘ΔʹͭΕͯɺͬ
ͺΓ3BJMTͷϨʔϧ͚ͩ͡Όݫ͍͠ɺͪΐͬͱ
ͣΕ͍ͨέʔε͕ग़ͯ͘Δ
Slide 14
Slide 14 text
ͦΜͳͱ͖Ͳ͏͢Δ͔
Slide 15
Slide 15 text
͍͔ͭ͘ͷʮϨʔϧΛͪΐͬͱͣΕͨʯ
ఆ൪ύλʔϯ͕͋Δ
w ංେԽͨ͠"DUJWF3FDPSEϞσϧΛϦϑΝΫλϦϯά͢
Δͭͷํ๏
w IUUQTUFDISBDIPCQTJODKQ
IBDIJ@@ ༁
w IUUQTDPEFDMJNBUFDPNCMPHXBZTUP
EFDPNQPTFGBUBDUJWFSFDPSENPEFMT ݪจ
w Ҏ্લ͚ͩͲݹͼͳ͍ఆ൪ͷهࣄ
Slide 16
Slide 16 text
Ͳ͔͜Ͱฉ͍ͨ͜ͱͷ͋Δύλʔϯୡ
w 7BMVF0CKFDU
w 4FSWJDF0CKFDU
w 'PSN0CKFDU
w 2VFSZ0CKFDU
w 7JFX0CKFDU
w 1PMJDZ0CKFDU
w %FDPSBUPS
Slide 17
Slide 17 text
Ͱ࣮ࡍͲ͏͔͍͍ͭ͑ͷ
w ͜ΕΒͷύλʔϯͷมछΛɺ৭Μͳਓ͕গ͠
ͣͭҧ͔ͬͨͨͪͰݴ͍ͬͯΔΑ͏ʹݟ͑Δ
w ݁ہɺ࣮ࡍʹऔΓೖΕΔஈͰɺͲ͏࣮͢Δ
͔໎ࢠʹͳͬͯ͠·͏
Slide 18
Slide 18 text
ੈͷதʹ
ʮͪΐͬͱͣΕͨϨʔϧʯ
ͷݱͰͷ࣮ྫ͕
·ͩ·ͩදʹग़͍ͯͳ͍
Slide 19
Slide 19 text
ͳΒ
Φʔϓϯʹ͢Δ͔͠ͳ͍
Slide 20
Slide 20 text
ࠓճ͜͏ͨ͠ύλʔϯΛ
ΩονϋΠΫͰ
Ͳ͏͖͔ͬͯͨɺ
ࣦഊؚΊͯ
͝հ͠·͢
Slide 21
Slide 21 text
ࠓճ͝հ͢Δύλʔϯ
w 7JFX.PEFM
w 'PSN.PEFM
w 4FSWJDF0CKFDU
Slide 22
Slide 22 text
ͦͷ·͑ʹ
Slide 23
Slide 23 text
ΩονϋΠΫͷίʔυ
w ݄3BJMT͔Β։ൃελʔτ
w ݄αʔϏεϩʔϯν
w Ҏ߱ؒɺdਓ͘Β͍Ͱ։ൃ
w ݄ݱࡏ
w σβΠφʔਓ
w ϓϩάϥϚʔਓ
w Λܴ͑ɺͦΕͳΓʹྺ࢙͋Δίʔυʹͳ͖ͬͯͨ
Slide 24
Slide 24 text
ΩονϋΠΫͷίʔυ
w ݱࡏͷόʔδϣϯ
w 3VCZ ૣ্͍͛ͨ͘
w 3BJMT ૣ্͍͛ͨ͘
w .POHPJE
w .POHP%#
Slide 25
Slide 25 text
ΩονϋΠΫͷίʔυ
w $POUSPMMFS
w $MBTTFT
-0$
w .PEFMT
w $MBTTFT
-0$
w খنͰͳ͘ͳͬͨେ͖͞
Slide 26
Slide 26 text
ͦͷ
7JFX.PEFM
Slide 27
Slide 27 text
Ϣʔεέʔε
w දࣔͷΈʹ͏Α͏ͳϩδοΫ
w ෳϞσϧʹ·͕ͨΔදࣔϩδοΫ
w ஔ͖ॴʹࠔΔͳ͜Εɾɾɾ
w ଥڠతͳબ͔ΒϏϡʔʹॻ͔ΕɺϏϡʔ͕͝
ͪΌͪ͝Όͯ͘͠Δ
ରࡦ͜͜Ͱ7JFX.PEFMͷग़൪
w දࣔϩδοΫΛ$POUSPMMFSͰͳ͘ɺ7JFXͰ
ͳ͘ɺ7JFX.PEFMʹॻ͘
w ͦΕ༻ͷ(FN͋Δ "DUJWF%FDPSBUPS
%SBQFS
w 1030Ͱे
Slide 30
Slide 30 text
7JFX.PEFM 1SFTFOUFS
ͷఆٛ
class ProductPresenter
# ...
def price
discount? ? @product.discount_price : @product.price
end
def discount?
@user.paid_member? && @product.member_only_discount?
end
end
Slide 31
Slide 31 text
7JFX͕͖ͬ͢Γʂ
# before
- if @user.paid_member? && @product.member_only_discount?
= @product.discount_price
- else
= @product.price
- end
# after
= @product_presenter.price
Slide 32
Slide 32 text
ͪͳΈʹ
w ʮදࣔϩδοΫ༻ͷϞσϧʯ͍Ζ͍Ζͳݺ
ͼํ͕͋Δ
w 7JFX.PEFM
7JFX0CKFDU
%FDPSBUPS
1SFTFOUFSɾɾɾ
w ͲΕ͕ਖ਼͍͠ͱ͍͏ͷͳ͍͕ɺνʔϜͰೝ
ࣝΛ߹Θ͓ͤͯ͘ͷ͕٢
Slide 33
Slide 33 text
ͪͳΈʹ
w ΩονϋΠΫͰҎԼͷΑ͏ʹݺͼ͚͍ͯ
Δ
w ૯শʮ7JFX.PEFMʯ
w ୯ҰϞσϧ༻ʮ%FDPSBUPSʯ
w ෳϞσϧ༻ʮ1SFTFOUFSʯ
Slide 34
Slide 34 text
Ϡολʔ
7JFX.PEFM
࠷ߴ
Slide 35
Slide 35 text
No content
Slide 36
Slide 36 text
ͦͯ͠ɺམͱ݀͠
Slide 37
Slide 37 text
ௐࢠʹΓ࣮͗ͨ͢ྫ
w ͬͱԠ༻Ͱ͖ΔͷͰʁͱࢥࣦͬͯഊͨ͠
࣮ྫ
w Ϩίʔυͷछྨ͝ͱʹࢀর͢ΔϞσϧ͕ҧ͏
͓ΒͤΛ࣮͠Α͏ͱͨ͠ͱ͖ͷ͜ͱ
Slide 38
Slide 38 text
͓Βͤը໘
w ͓Βͤͷใछྨ͝ͱ
ʹ͍ΖΜͳςʔϒ
ϧ͔Βσʔ
λΛऔΔඞཁ͕͋Δ
w ҰํɺදࣔΠϯλʔϑΣʔ
εڞ௨
w ͓Βͤ༻ςʔϒϧ࡞Βͳ
ͯ͘ɺ1SFTFOUFSͰ͍͚
ΔͷͰʁ
Slide 39
Slide 39 text
Ͳ͏ͳ͔ͬͨ
w తʹݴࣦͬͯഊͩͬͨ
w /͕ൃੜɻ͔͠ɺߏతʹͮ͠Β͍
w ࢀর͢Δςʔϒϧ͕Ϩίʔυ͝ͱʹҧ͏͔Β
FBHFS@MPBEͮ͠Β͍
w ૉʹςʔϒϧ࡞ΕΑ͔ͬͨͷʹɾɾɾ
Slide 40
Slide 40 text
7JFX.PEFMͷֶͼ
w 7JFX.PEFM1030ͳͷͰ৭ʑ༥௨͕ར͖
͍͢
w ͕ͩɺ.PEFM͔Βੜ͢ΔͷͰɺσʔλΞΫη
εͷ͕ى͖͍͢
w ಛʹҰཡܥͰཁҙ
Slide 41
Slide 41 text
ͦͷ
'PSN.PEFM
Slide 42
Slide 42 text
Ϣʔεέʔε
w Ϟσϧʹඥ͔ͳ͍ϑΥʔϜΛѻ͏έʔε
w ӬଓԽ͠ͳ͍߲͕͋Δ
w ෳϞσϧʹ·͕ͨΔ
w ϦΫΤετύϥϝʔλΛ$POUSPMMFSͰ͋͋ͨ͠Γɺ
͜͏ͨ͠Γɾɾɾ
w $POUSPMMFSͷίʔυ͕ͪ͝Όͪ͝Όͯ͘͠Δ
ରࡦ͜͜Ͱ'PSN.PEFMͷग़൪
w Ϟσϧʹඥ͔ͳ͍ɺϑΥʔϜઐ༻ͷϞσϧΛ
ఆٛ͢Δ
w ϦΫΤετύϥϝʔλͷνΣοΫͳͲ'PSN
.PEFMͰߦ͏
Slide 46
Slide 46 text
'PSN.PEFMͷఆٛ
class EventCancellationMessageForm
include ActiveModel::Model
attr_accessor :event_id, :body, :confirmed
validates :body, presence: true
validates :confirmed, acceptance: true
# ...
end
Slide 47
Slide 47 text
$POUSPMMFS͕͖ͬ͢Γʂ
# before
if params[:confirmed] == "1"
# ...
else
# ...
end
# after
@event_cancellation_form =
EventCancellationMessageForm.new(cancellation_message_params)
# パラメータチェックが複数あってもFormModel内で処理できる
if @event_cancellation_form.valid?
# ...
end
Slide 48
Slide 48 text
'PSN.PEFMͷఆٛ
w "DUJWF.PEFM.PEFMΛJODMVEF
w GPSN@XJUI
GPSN@GPSͰ௨ৗͷϞσϧͷΑ͏ʹѻ͑Δʂ
w ϑΥʔϜʹඥ͔ͳ͍όϦσʔγϣϯΛ'PSN.PEFM
Ͱ͖ͬ͢Γॻ͚Δ
w ʮ֬ೝ͠·ͨ͠ʯνΣοΫ
w ෳϞσϧʹ·͕ͨΔόϦσʔγϣϯ
Slide 49
Slide 49 text
͞ΒʹɺԠ༻ར͘ΜͰ͢
# view
= form_for @bulk_schedule_form, url:schedules_path, method: "post" do |f|
= f.fields_for :schedules do |s|
# ...
=f.submit "一括登録"
# form_model
class BulkScheduleForm
includes Activemodel::Model
attr_accessor: schedules
# ...
def schedule_attributes=(attributes)
self.schedules = attributes.map do |schedule_attributes|
schedule.new(schedule_attributes)
end
end
end
Slide 50
Slide 50 text
Ұׅొ'PSNʹ͑Δ
w গ͠खΛՃ͑ΕҰׅొ'PSNͳͲʹԠ༻
͕ར͘
w ࢠϨίʔυͷߋ৽ؚΉ߹ɺ
BDDFQUT@OFTUFE@BUUSJCVUFT@GPSͳͤ͘Δ
Slide 51
Slide 51 text
Ϡολʔ
'PSN.PEFM
࠷ߴ
Slide 52
Slide 52 text
No content
Slide 53
Slide 53 text
ͦͯ͠ɺམͱ݀͠
Slide 54
Slide 54 text
'PSN.PEFMଠΓ͕ͪ
w 'PSN.PEFM͕ଠͬͯ͠·ͬͨ
w όϦσʔγϣϯ͕ෳࡶԽ
w ͜ΕϞσϧʹॻ͚͍͍ͷͰʁͳόϦσʔ
γϣϯ·Ͱ'PSN.PEFMʹॻ͔Εͯ͠·ͬͨ
Slide 55
Slide 55 text
'PSN.PEFMͷֶͼ
w 'PSN.PEFMԠ༻ར͍ͯΜΓ
w 'PSN.PEFMബ͘ɻ͋͘·Ͱओ.PEFM
w όϦσʔγϣϯͳͲͷɺ.PEFMʹۃྗ࣋
ͨͤͯɺ'PSN.PEFMͦΕΛݺͼग़͚ͩ͢ʹ
͠Α͏
Slide 56
Slide 56 text
ͦͷ
4FSWJDF0CKFDU
Slide 57
Slide 57 text
Ϣʔεέʔε
w ͋Δखଓ͖Λͻͱ·ͱ·Γʹ͍ͨ͠ͱ͖
w ෳͷϞσϧʹର͢Δॲཧ
w %#ͷτϥϯβΫγϣϯ
w ϕλʹ$POUSPMMFSʹॻ͍͍ͯͬͯɺ$POUSPMMFS
ͷݟ௨͕͠ѱ͘ͳΔ
Slide 58
Slide 58 text
ରࡦ͜͜Ͱ4FSWJDF0CKFDUͷग़൪
w 4FSWJDF0CKFDUʹͻͱ·ͱ·ΓͷॲཧΛҠಈ͞
ͤΔ
w BQQTFSWJDFTҎԼʹ4FSWJDF0CKFDUΛఆٛ
w ݴޠΘͣఆ൪ͷύλʔϯ
Slide 59
Slide 59 text
4FSWJDF0CKFDUͷఆٛ
# service_object
class EventCreateService
def initialize(params)
# ...
end
def call
# ...
end
end
# controller
service = EventCreateService.new(event_params)
service.call
if service.success?
# ...
end
Slide 60
Slide 60 text
4FSWJDF0CKFDUͷఆٛ
w ίϯετϥΫλҎ֎ɺQVCMJDϝιουجຊͻͱͭͷΈ
w DBMMͱ͔FYFDVUFͱ͔
w $PNNBOEύλʔϯͬΆ͍
w ඞཁʹԠͯ͡εςʔτϦʔμʔΛఆٛ
w $POUSPMMFSʹϕλॻ͖͞ΕͨϏδωεϩδοΫΛ
4FSWJDF0CKFDUʹఆٛͯ͠ɺ$POUSPMMFSΛ͖ͬ͢Γ
Slide 61
Slide 61 text
4FSWJDF0CKFDUͷఆٛ
w ϝδϟʔͳύλʔϯͳͷͰɺ044ࢀߟʹ͍͢͠
w .BTUPEPOͳͲ
w ΩονϋΠΫͰҎԼΛࢀߟʹ͍ͯ͠Δ
w 3BJMTͰॏཁͳύλʔϯQBSU4FSWJDF0CKFDU
w IUUQTUFDISBDIPCQTJODKQ
IBDIJ@@ ༁
Slide 62
Slide 62 text
Ϡολʔ
4FSWJDF0CKFDU
࠷ߴ
Slide 63
Slide 63 text
No content
Slide 64
Slide 64 text
ͦͯ͠ɺམͱ݀͠
Slide 65
Slide 65 text
αʔϏεͷ֓೦͗͢
w 4FSWJDFͷޠ͕Ұൠత͗ͯ͢ɺ͍ΖΜͳఆ͕ٛ
͋Δ
w ΈΜͳͷ;Θͬͱͨ͠ײ֮ͰΫϥεΛՃ͠
͍ͯ͘ͱɺBQQTFSWJDFTσ
ΟϨΫτϦҎԼ͕ଠͬ
͍ͯ͘
Slide 66
Slide 66 text
͋ͳͨͷαʔϏεͲͷαʔϏεʁ
w ͦͦ&SJD&WBOTͷ%%%ຊͰͷαʔϏεఆ͕ٛ෯͍
w ΞϓϦέʔγϣϯαʔϏε
w υϝΠϯαʔϏε
w ΠϯϑϥετϥΫνϟαʔϏε
w 1PG&""ͷαʔϏεϨΠϠʔ
w ͍͍ײ͡ͷศརϝιουͱͯ͠4FSWJDF͕ΘΕΔ
w ͜ͷΛҙ͍ࣝͯ͠ͳ͍ͱɺ͕͔Έ߹Θͳ͍
Slide 67
Slide 67 text
͞Βʹɺམͱ݀͠
Slide 68
Slide 68 text
τϥϯβΫγϣϯεΫϦϓτ
w 4FSWJDF0CKFDUʹϞϦϞϦϩδοΫΛॻ͍ͯ͠
·͏
w ݁Ռɺ$POUSPMMFSͷ͔ΘΓʹ4FSWJDF0CKFDU
ͷݟ௨͕͠ѱ͍͚ͩʹͳΔ
w υϝΠϯϞσϧශ݂
Slide 69
Slide 69 text
֓೦Λཧ͢Δ
w ΩονϋΠΫͰͷαʔϏεΞϓϦέʔγϣ
ϯαʔϏεͱͯ͠ఆ͍ٛͯ͠Δ
w ͱ͍͏ͷͷɺ৭ʑͳαʔϏε͕ࠞࡏͯ͠
͍ͯಓ
Slide 70
Slide 70 text
αʔϏεബ͘
w ϩδοΫϞσϧʹॻ͘
w 4FSWJDF0CKFDUͦΕΛݺͼग़͚ͩ͢
w αʔϏεΫϥεʹͭͷࣄ
w ಈࢺ໊ࢺ4FSWJDF
w ྫ$SFBUF&WFOU4FSWJDF
Slide 71
Slide 71 text
4FSWJDF0CKFDUͷֶͼ
w 4FSWJDFͷڞ௨ೝࣝΛνʔϜͰڞ༗͓ͯ͘͠
w ڞ௨ͨ͠ਖ਼ղͱ͍͏ͷͳͦ͞͏
w ஔ໋໊͖نଇɺΠϯλʔϑΣʔεΛͪΌΜͱඋ
͠Α͏
w 4FSWJDFബ͘ɻ͋͘·Ͱओ.PEFM
w υϝΠϯϩδοΫɺ.PEFMʹۃྗ࣋ͨͤͯɺ4FSWJDF
0CKFDUͦΕΛݺͼग़͚ͩ͢ʹ͠Α͏