Slide 1

Slide 1 text

೥໨Λܴ͑ͨ3BJMT ΞϓϦέʔγϣϯͷ܏޲ͱରࡦ ࣦͦͯ͠ഊ 3BJMT%FWFMPQFST.FFUVQ גࣜձࣾΩονϋΠΫখ઒߶

Slide 2

Slide 2 text

%))৴ऀͷΈͳ͞Μ ͜Μʹͪ͸ʂ

Slide 3

Slide 3 text

ࢲ΋Ͱ͢ʂ

Slide 4

Slide 4 text

ࣗݾ঺հ w גࣜձࣾΩονϋΠΫΤϯδχΞ w খ઒߶ (JU)VCUBPHBXB w αʔόʔαΠυΛओʹ୲౰͍ͯ͠·͢ɻ

Slide 5

Slide 5 text

%))৴ऀͱͯ͠ͷ Ξ΢τϓοτ

Slide 6

Slide 6 text

IUUQTUFDILJUDIIJLFDPNFOUSZ

Slide 7

Slide 7 text

ຊ೔ͷςʔϚ

Slide 8

Slide 8 text

ຊ೔ͷςʔϚ Ϩʔϧ͔Βগ͠֎Εͨઌͷ ύλʔϯ

Slide 9

Slide 9 text

͸͡Ίʹ

Slide 10

Slide 10 text

3BJMT͸ ʮͷιϦϡʔγϣϯͰ ໰୊ͷΛղܾͰ͖Δʯ ϑϨʔϜϫʔΫ ʮ3VCZPO3BJMT%))ͷΠϯλϏϡʔʯ IUUQTLENTOSDPNUSBOTMBUJPOTJOUFSWJFXXJUIEII ຋༁

Slide 11

Slide 11 text

ͦͷͱ͓Γɺ େମͷ͜ͱΛ؆୯ʹ͢͹΍͘ Ͱ͖ΔΑ͏ʹͳ͍ͬͯΔ

Slide 12

Slide 12 text

ͷιϦϡʔγϣϯͰ໰୊ͷΛղܾͰ͖Δ 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 ଥڠతͳબ୒͔ΒϏϡʔʹॻ͔ΕɺϏϡʔ͕͝ ͪΌͪ͝Όͯ͘͠Δ

Slide 28

Slide 28 text

͜Μͳͱ͖ # 表示にだけ必要な日付フォーマット = @event.start_at.strftime('%Y/%m/%d %H:%M') # 複数のモデルが関連する表示ロジック - if @user.paid_member? && @product.member_only_discount? = @product.discount_price - else = @product.price

Slide 29

Slide 29 text

ରࡦ͜͜Ͱ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.PEFM͸1030ͳͷͰ৭ʑ༥௨͕ར͖΍ ͍͢ w ͕ͩɺ.PEFM͔Βੜ੒͢ΔͷͰɺσʔλΞΫη εͷ໰୊͕ى͖΍͍͢ w ಛʹҰཡܥͰ͸ཁ஫ҙ

Slide 41

Slide 41 text

ͦͷ 'PSN.PEFM

Slide 42

Slide 42 text

Ϣʔεέʔε w Ϟσϧʹඥ෇͔ͳ͍ϑΥʔϜΛѻ͏έʔε w ӬଓԽ͠ͳ͍߲໨͕͋Δ w ෳ਺Ϟσϧʹ·͕ͨΔ w ϦΫΤετύϥϝʔλΛ$POUSPMMFS಺Ͱ͋͋ͨ͠Γɺ ͜͏ͨ͠Γɾɾɾ w $POUSPMMFS಺ͷίʔυ͕ͪ͝Όͪ͝Όͯ͘͠Δ

Slide 43

Slide 43 text

Α͋͘Δ֬ೝνΣοΫ w ϝοηʔδ͸%#ʹ อଘͷඞཁ͕͋Δ͕ɺ ֬ೝνΣοΫ͸อଘ ෆཁ

Slide 44

Slide 44 text

Α͋͘Δ֬ೝνΣοΫ # view = form_for(@event, url:foo_path(@event), method: 'patch') do |f| = f.hidden_field :event_id = text_area_tag :body = check_box_tag :confirmed # 確認チェック = f.submit "予約をキャンセル" # controller # パラメータのチェックが複数あると見通しが悪くなる if params[:confirmed] == "1" # ... else # ... end

Slide 45

Slide 45 text

ରࡦ͜͜Ͱ'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͸ͦΕΛݺͼग़͚ͩ͢ʹ͠Α͏

Slide 72

Slide 72 text

·ͱΊ

Slide 73

Slide 73 text

ϨʔϧΛͪΐͬͱ֎Εͨ ఆ൪ύλʔϯͨͪɺ ศརͰ͢Α

Slide 74

Slide 74 text

͚ΕͲ ੈͷதʹ͸·ͩ·࣮ͩྫ͕଍Γͳ͍ ݱ৔ͷ஌ݟ͕޿·Βͳ͚Ε͹ ύλʔϯ͸ఆண͠ͳ͍

Slide 75

Slide 75 text

͜ΕͰ3BJMT͸ େ͖ͳΞϓϦέʔγϣϯʹ࢖͑ͳ͍ ͳΜͯݴ༿͸ෆຊҙͰ͸ʁ

Slide 76

Slide 76 text

΋ͬͱ΋ͬͱ ࣗ෼ͨͪͷ औΓ૊ΈΛɺࣦഊΛɺ Φʔϓϯʹ͢Δ ͦΜͳ3BJMTίϛϡχςΟ΁ͷ ߩݙ΋͋ΔͷͰ͸

Slide 77

Slide 77 text

΋ͬͱ΋ͬͱ Έͳ͞Μͷ ݱ৔ͷ஌ݟΛΦʔϓϯʹ

Slide 78

Slide 78 text

͝ਗ਼ௌ ͋Γ͕ͱ͏͍͟͝·ͨ͠