$30 off During Our Annual Pro Sale. View Details »

初めてのPadrino

Takeshi Yabe
December 11, 2014

 初めてのPadrino

日本OSS推進フォーラム主催 第4回アプリケーション部会勉強会 での発表資料

Takeshi Yabe

December 11, 2014
Tweet

More Decks by Takeshi Yabe

Other Decks in Technology

Transcript

  1. ॳΊͯͷ1BESJOP
    ʙ1BESJOPΛར༻ͨ͠8ΞϓϦέʔγϣϯ࡞੒ํ๏ͷ঺հʙ
    ೔ຊ044ਪਐϑΥʔϥϜओ࠵
    ୈ̐ճΞϓϦέʔγϣϯ෦ձษڧձ
    ೥݄೔
    5BLFTIJ:BCF !UZBCF

    View Slide

  2. ͓࿩͢Δ͜ͱ
    w ࣗݾ঺հ
    w ୈ෦1BESJOP֓ཁ
    w ୈ෦1BESJOPΛ࢖ͬͨ։ൃͷ࣮ફ

    View Slide

  3. 5BLFTIJ:BCF
    !UZBCF
    ΞϓϦέʔγϣϯΤϯδχΞ
    ओͳ୲౰͸αʔόαΠυ
    :PLPIBNBSC 4IJCVZBSC
    1BESJOPͱͷग़ձ͍͸೥ࠒ

    View Slide

  4. View Slide

  5. View Slide

  6. View Slide

  7. ୈ෦
    1BESJOP֓ཁ
    1BESJOPͱ͸Ͳ͏͍ͬͨ΋ͷ͔ʢྺ࢙ɾಛ௃ʣΛઆ໌ͭͭ͠ɺ
    1BESJOPΞʔΩςΫνϟͷ֓આɺಛ௃తػೳ౳Λઆ໌͠·͢ɻ

    View Slide

  8. 1BESJOPͱ͸
    3VCZ੡ͷ8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
    8FCΞϓϦέʔγϣϯΛखૣ͘࡞ΔͨΊͷ%4-Ͱ͋Δ
    4JOBUSBͷίʔυͱઃܭࢥ૝Λϕʔεʹɺ
    8FCΞϓϦέʔγϣϯ։ൃͰΑ͘࢖ΘΕΔͰ͋Ζ͏
    ϥΠϒϥϦ΍ϔϧύʔϝιουͳͲΛ௥Ճ͢Δ͜ͱͰɺ
    ෳࡶͳ8FCΞϓϦέʔγϣϯ։ൃͰ΋
    ར༻ՄೳͳΑ͏ʹ͢Δ͜ͱΛ໨తͱ͍ͯ͠Δ

    View Slide

  9. 1BESJOPͱ͸

    View Slide

  10. 1BESJOPͱ͸
    1BESJOP͸ΠλϦΞޠɺӳޠͩͱ(PEGBUIFS
    lγφτϥzͰ࡞ΒΕ͍ͯΔ͔ΒΒ͍͠ʜ

    View Slide

  11. 1BESJOPͱ͸
    4JOBUSBϕʔε
    ίʔυ͚ͩͰ͸ͳ͘ઃܭํ਑΋
    ࢖͏ͱ͖΋ίϨ͕؊ཁ

    View Slide

  12. View Slide

  13. 4JOBUSB
    4JOBUSB͸ϑϨʔϜϫʔΫͰ͸ͳ͘ɺ
    8FCΞϓϦέʔγϣϯ 3BDLΞϓϦέʔγϣϯ
    Λ
    खૣ͘؆୯ʹهड़͢ΔͨΊͷ%4-
    l4JOBUSBJTB%4-GPSRVJDLMZ
    DSFBUJOHXFCBQQMJDBUJPOTJO3VCZ
    XJUINJOJNBMF⒎PSUz
    IUUQXXXTJOBUSBSCDPNJOUSPΑΓҾ༻

    View Slide

  14. ΫϥγοΫελΠϧ
    1 require 'sinatra'
    2
    3 get '/' do
    4 "Hello, sinatra!"
    5 end
    ϞδϡϥʔελΠϧ
    1 require 'sinatra/base'
    2
    3 class App < Sinatra::Base
    4 get '/' do
    5 "Hello, world!"
    6 end
    7 end
    ୯ମͰ࢖͏γϯϓϧͳΞϓϦͳΒΫϥγοΫελΠϧ
    ଞͷ3BDLΞϓϦͱҰॹʹ࢖͏ͳΒϞδϡϥʔελΠϧ
    4JOBUSB

    View Slide

  15. 4JOBUSB
    ؆ܿͰ͋Δ͜ͱ
    ෳࡶੑ͸ඞཁʹͳͬͨͱ͖ʹ௥Ճ

    View Slide

  16. 4JOBUSB
    γϯϓϧ
    ͚ͩͲʜ

    View Slide

  17. NZQSPKFDU
    ᵓᴷᴷ(FNpMF
    ᵓᴷᴷ(FNpMFMPDL
    ᵓᴷᴷ3BLFpMF
    ᵓᴷᴷBQQSC
    ᵓᴷᴷDPOpH
    ᴹᵋᴷᴷEBUBCBTFSC
    ᵓᴷᴷDPOpHSV
    ᵓᴷᴷEC
    ᴹᵋᴷᴷEFWFMPQNFOUEC
    ᵓᴷᴷMPH
    ᴹᵋᴷᴷEFWFMPQNFOUMPH
    ᵓᴷᴷNBJMFSSC
    ᵓᴷᴷQVCMJD
    ᴹᵓᴷᴷKBWBTDSJQUT
    ᴹᴹᵋᴷᴷBQQKT
    ᴹᵋᴷᴷTUZMFTIFFUT
    ᴹᵋᴷᴷBQQDTT
    ᵋᴷᴷWJFXT
    ᵓᴷᴷJOEFYTMJN
    ᵋᴷᴷMBZPVUTMJN
    σΟϨΫτϦߏ଄
    %#ͷઃఆ
    ϩάͷઃఆ
    ϔϧύʔϝιου
    )5.-Τεέʔϓ
    ηογϣϯ
    ςετ؀ڥ
    ίϯιʔϧͰͷಈ࡞֬ೝ
    3BLFλεΫ
    ͳͲͳͲ
    ָ͍ͨ͠
    4JOBUSB

    View Slide

  18. View Slide

  19. 1BESJOPͷྺ࢙
    TJOBUSB@NPSFͷ։ൃ͕ελʔτ
    QBESJOPͷ։ൃ͕ελʔτ

    TJOBUSB@NPSF͕QBESJOP΁ͷҠߦΛද໌
    TJOBUSB@NPSF࠷ޙͷίϛοτ
    ʜ
    ೔ຊਓ͕։ൃνʔϜೖΓ !OBNVTZBLB

    ϦϦʔε
    3VCZͷαϙʔτഇࢭͳͲେ͖Ίͷมߋ
    ϦϦʔε
    EZOBNPJEͷαϙʔτɺDBDIF@PCKFDUIFMQFSͷ௥Ճ
    ϦϦʔε
    1BSBNT1SPUFDUJPOͷ௥Ճ
    ϦϦʔε
    SPVUFS SFMPBEFS HFOFSBUPSͷվળ
    ϦϦʔε
    NPVOUFS͕վળ͞Εɺଞͷ3BDLΞϓϦͷϚ΢ϯτ͕Մೳʹͳͬͨ
    OFTRVFOB͕ݸਓͰ։ൃ
    OFTRVFOBͱɺಉ྅ͩͬͨ
    %"EE:& BDIJVͰ։ൃ
    ৽͍͠ϧʔλʔ QFOESBHPO

    Λ։ൃ

    View Slide

  20. 1BESJOPͷར༻ऀ

    View Slide

  21. 1BESJOPͷओͳػೳ
    δΣωϨʔλؚΉίϚϯυϥΠϯπʔϧ
    αϒΞϓϦέʔγϣϯ
    ଞͷ3BDLΞϓϦέʔγϣϯͷϚ΢ϯτ
    ϧʔςΟϯάͷ֦ு
    .7$ύλʔϯͷಋೖ
    ๛෋ͳϔϧύʔϝιου
    ؆୯ͳϝʔϧૹ৴ػೳ
    Ωϟογϡػೳ
    ࠃࡍԽػೳ
    ଞͷϥΠϒϥϦͱ࿈ܞՄೳͳϩΨʔ
    ։ൃ࣌ͷϦϩʔμʔ

    View Slide

  22. 1BESJOPͷߏ੒
    1BESJOP'SBNFXPSL
    DPSF
    4JOBUSB
    IFMQFST
    NBJMFST
    TVQQPSU
    HFO
    DBDIF BENJO

    View Slide

  23. QBESJOPDPSF

    View Slide

  24. QBESJOPDPSF
    4JOBUSBΛ֦ுͨ͠ϕʔεΞϓϦέʔγϣϯ
    1BESJOP'SBNFXPSLͷػೳΛશͯ࢖͏͜ͱ͕Ͱ͖Δ
    # lib/padrino-core/application.rb
    1 module Padrino
    2 class Application < Sinatra::Base
    3 register Padrino::ApplicationSetup
    4 register Padrino::Routing
    5 register Padrino::ParamsProtection
    SFHJTUFSϝιουʹΑΔ4JOBUSB֦ுͷొ࿥
    VTFϝιουʹΑΔ3BDLϛυϧ΢ΣΞͷొ࿥

    View Slide

  25. QBESJOPDPSF
    ௥Ճ͞ΕΔओͳػೳ
    ϧʔςΟϯάͷ֦ு
    αϒΞϓϦέʔγϣϯͱͦͷଞͷ3BDLΞϓϦͷϚ΢ϯτػߏ
    Φʔτϩʔυର৅σΟϨΫτϦͷઃఆ
    ֦ு͞ΕͨϩΨʔ
    ։ൃ༻ͷϦϩʔμʔ
    ίϚϯυϥΠϯπʔϧ TUBSU TUPQ HFOFSBUF DPOTPMF SVOOFS SBLF

    View Slide

  26. QBESJOPDPSF
    ௥Ճ͞ΕΔओͳػೳ
    ϧʔςΟϯάͷ֦ு
    αϒΞϓϦέʔγϣϯͱͦͷଞͷ3BDLΞϓϦͷϚ΢ϯτػߏ
    Φʔτϩʔυର৅σΟϨΫτϦͷઃఆ
    ֦ு͞ΕͨϩΨʔ
    ։ൃ༻ͷϦϩʔμʔ
    ίϚϯυϥΠϯπʔϧ TUBSU TUPQ HFOFSBUF DPOTPMF SVOOFS SBLF

    View Slide

  27. QBESJOPDPSF
    1 SampleProject::App.controllers :posts do
    2 get :index do
    3 # url(:posts, :index) => "/posts"
    4 render 'posts/index'
    5 end
    6
    7 get :show, map: '/posts/:id' do
    8 # url(:posts, :show, id: 5) => "/posts/5"
    9 render 'posts/new'
    10 end
    11 end
    ϧʔςΟϯάͷ֦ுʢҰྫʣ
    ໊લ෇͖ϧʔτɺςϯϓϨʔτΤϯδϯͷࣗಈݕग़

    View Slide

  28. QBESJOPDPSF
    ֦ு͞ΕͨϩΨʔ

    View Slide

  29. QBESJOPHFO

    View Slide

  30. - project
    - app
    - mailer
    - controller
    - helper
    - model
    - migration
    - plugin
    - component
    - task
    - admin
    - admin_page
    QBESJOPHFO
    ৽͍͠1BESJOPϓϩδΣΫτͷ࡞੒࣌΍
    طଘͷ1BESJOPϓϩδΣΫτ΁
    ؆୯ʹίʔυΛ௥Ճ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ

    View Slide

  31. QBESJOPHFO
    ৽͍͠1BESJOPϓϩδΣΫτͷ࡞੒࣌΍
    طଘͷ1BESJOPϓϩδΣΫτ΁
    ؆୯ʹίʔυΛ௥Ճ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ
    - project
    - app
    - mailer
    - controller
    - helper
    - model
    - migration
    - plugin
    - component
    - task
    - admin
    - admin_page

    View Slide

  32. QBESJOPHFO ϓϩδΣΫτੜ੒

    Usage:
    padrino-gen project [name] [options]
    Options:
    -n, [--app=APP]
    -b, [--bundle], [--no-bundle]
    -r, [--root=ROOT]
    [--dev], [--no-dev]
    -i, [--tiny], [--no-tiny]
    -l, [--lean], [--no-lean]
    -a, [--adapter=ADAPTER]
    -p, [--template=TEMPLATE]
    -g, [--gem], [--no-gem]
    [--migration-format=MIGRATION_FORMAT]
    -d, [--orm=ORM]
    -t, [--test=TEST]
    -m, [--mock=MOCK]
    -s, [--script=SCRIPT]
    -e, [--renderer=RENDERER]
    -c, [--stylesheet=STYLESHEET]
    QBESJOPϓϩδΣΫτͰ࢖͏৔߹͸
    QBESJOPHQSPKFDU

    View Slide

  33. QBESJOPHFO ϓϩδΣΫτੜ੒

    03.ɺσʔλϕʔεΞμϓλɺςϯϓϨʔτΤϯδϯɺ
    ςεςΟϯάϑϨʔϜϫʔΫɺϞοΫϥΠϒϥϦɺ
    ελΠϧγʔτΤϯδϯɺ+BWB4DSJQUϥΠϒϥϦ
    ඞཁͳ΋ͷ͚ͩΛબΜͰ࢖͑Δ બ͹ͳͯ͘΋ྑ͍

    View Slide

  34. QBESJOPHFO ϓϩδΣΫτੜ੒

    QBESJOPHQSPKFDUTBNQMF@QSPKFDU
    TBNQMF@QSPKFDU
    ᵓᴷᴷ(FNpMF
    ᵓᴷᴷ3BLFpMF
    ᵓᴷᴷBQQ
    ᴹᵓᴷᴷBQQSC
    ᴹᵓᴷᴷDPOUSPMMFST
    ᴹᵓᴷᴷIFMQFST
    ᴹᵋᴷᴷWJFXT
    ᴹᵋᴷᴷMBZPVUT
    ᵓᴷᴷCJO
    ᴹᵋᴷᴷTBNQMF@QSPKFDU
    ᵓᴷᴷDPOpH
    ᴹᵓᴷᴷBQQTSC
    ᴹᵋᴷᴷCPPUSC
    ᵓᴷᴷDPOpHSV
    ᵓᴷᴷMPH
    ᵓᴷᴷQVCMJD
    ᴹᵓᴷᴷGBWJDPOJDP
    ᴹᵓᴷᴷJNBHFT
    ᴹᵓᴷᴷKBWBTDSJQUT
    ᴹᵋᴷᴷTUZMFTIFFUT
    ᵋᴷᴷUNQ
    EJSFDUPSJFT pMFT
    QBESJOPHQSPKFDUUJOZ@QSPKFDUŠUJOZ
    UJOZ@QSPKFDU
    ᵓᴷᴷ(FNpMF
    ᵓᴷᴷ3BLFpMF
    ᵓᴷᴷBQQ
    ᴹᵓᴷᴷBQQSC
    ᴹᵓᴷᴷDPOUSPMMFSTSC
    ᴹᵓᴷᴷIFMQFSTSC
    ᴹᵋᴷᴷNBJMFSTSC
    ᵓᴷᴷCJO
    ᴹᵋᴷᴷUJOZ@QSPKFDU
    ᵓᴷᴷDPOpH
    ᴹᵓᴷᴷBQQTSC
    ᴹᵋᴷᴷCPPUSC
    ᵓᴷᴷDPOpHSV
    ᵓᴷᴷMPH
    ᵓᴷᴷQVCMJD
    ᴹᵓᴷᴷGBWJDPOJDP
    ᴹᵓᴷᴷJNBHFT
    ᴹᵓᴷᴷKBWBTDSJQUT
    ᴹᵋᴷᴷTUZMFTIFFUT
    ᵋᴷᴷUNQ
    EJSFDUPSJFT pMFT

    View Slide

  35. QBESJOPHFO ίϯϙʔωϯτͷ௥Ճ

    Usage:
    padrino-gen component [options]
    Options:
    -n, [--app=APP]
    -r, [--root=ROOT]
    -a, [--adapter=ADAPTER]
    -d, [--orm=ORM]
    -t, [--test=TEST]
    -m, [--mock=MOCK]
    -s, [--script=SCRIPT]
    -e, [--renderer=RENDERER]
    -c, [--stylesheet=STYLESHEET]
    Description:
    padrino-gen component add components into a Padrino project
    Current Selected Components:
    orm none
    test none
    mock none
    script none
    renderer slim
    stylesheet none
    ඞཁʹͳͬͨͱ͖ʹ
    ඞཁͳ΋ͷΛ௥ՃͰ͖Δ

    View Slide

  36. QBESJOPHFO αϒΞϓϦέʔγϣϯ

    αϒΞϓϦέʔγϣϯ͸
    Ϟσϧ΍ϥΠϒϥϦΛڞ௨Ͱ࢖͑Δ
    QBESJOPHBENJO
    QBESJOPHBQQBQJ
    TBNQMF@QSPKFDU
    ᵓᴷᴷBQQ
    ᴹᵓᴷᴷBQQSC
    ᴹᵓᴷᴷDPOUSPMMFST
    ᴹᵓᴷᴷIFMQFST
    ᴹᵋᴷᴷWJFXT
    ᴹᵋᴷᴷMBZPVUT
    ᵓᴷᴷBENJO
    ᴹᵓᴷᴷBQQSC
    ᴹᵓᴷᴷDPOUSPMMFST
    ᴹᵓᴷᴷIFMQFST
    ᴹᵋᴷᴷWJFXT
    ᴹᵋᴷᴷMBZPVUT
    ᵓᴷᴷBQJ
    ᴹᵓᴷᴷBQQSC
    ᴹᵓᴷᴷDPOUSPMMFST
    ᴹᵓᴷᴷIFMQFST
    ᴹᵋᴷᴷWJFXT
    ᴹᵋᴷᴷMBZPVUT
    ᵋᴷᴷQVCMJD
    ᵓᴷᴷBENJO
    ᴹᵓᴷᴷJNBHFT
    ᴹᵓᴷᴷKBWBTDSJQUT
    ᴹᵋᴷᴷTUZMFTIFFUT
    ᵓᴷᴷGBWJDPOJDP
    ᵓᴷᴷJNBHFT
    ᵓᴷᴷKBWBTDSJQUT
    ᵋᴷᴷTUZMFTIFFUT
    # config/apps.rb
    1 Padrino.mount('SampleProject::Admin')
    2 .to('/admin')
    3 Padrino.mount('SampleProject::Api')
    4 .to('/')
    5 .host("api.example.org")
    6 Padrino.mount('SampleProject::App')
    7 .to(‘/')
    Ϛ΢ϯτͷઃఆͰɺҰகͤ͞Δύε΍ϗετ໊ΛࢦఆͰ͖Δ

    View Slide

  37. QBESJOPBENJO

    View Slide

  38. QBESJOPBENJO
    Ϣʔβೝূ෇͖ͷ؅ཧΞϓϦ͕࡞੒Ͱ͖ΔΑ͏ʹͳΔ
    QBESJOPHBENJO

    View Slide

  39. QBESJOPBENJO
    # config/apps.rb
    1 Padrino.mount('SampleProject::Admin').to('/admin')
    2 Padrino.mount('SampleProject::App').to('/')
    BENJO
    ᵓᴷᴷBQQSC
    ᵓᴷᴷDPOUSPMMFST
    ᴹᵓᴷᴷBDDPVOUTSC
    ᴹᵓᴷᴷCBTFSC
    ᴹᵋᴷᴷTFTTJPOTSC
    ᵋᴷᴷWJFXT
    ᵓᴷᴷBDDPVOUT
    ᴹᵓᴷᴷ@GPSNTMJN
    ᴹᵓᴷᴷFEJUTMJN
    ᴹᵓᴷᴷJOEFYTMJN
    ᴹᵋᴷᴷOFXTMJN
    ᵓᴷᴷCBTF
    ᴹᵋᴷᴷJOEFYTMJN
    ᵓᴷᴷFSSPST
    ᴹᵓᴷᴷTMJN
    ᴹᵓᴷᴷTMJN
    ᴹᵋᴷᴷTMJN
    ᵓᴷᴷMBZPVUT
    ᴹᵓᴷᴷBQQMJDBUJPOTMJN
    ᴹᵋᴷᴷFSSPSTMJN
    ᵋᴷᴷTFTTJPOT
    ᵋᴷᴷOFXTMJN
    EJSFDUPSJFT pMFT
    ؅ཧΞϓϦ͸αϒΞϓϦέʔγϣϯͱͯ͠
    Ϛ΢ϯτ͢Δ

    View Slide

  40. QBESJOPBENJO

    View Slide

  41. QBESJOPBENJO
    ϞσϧʹରԠͨ͠؅ཧϖʔδΛ௥ՃͰ͖Δ
    QBESJOPHBENJO@QBHFmodel

    View Slide

  42. QBESJOPBENJO
    ؅ཧΞϓϦ༻ͷϔϧύʔϝιου͕͍͔ͭ͘௥Ճ͞ΕΔ
    1 module SampleProject
    2 class Admin < Padrino::Application
    3 register Padrino::Mailer
    4 register Padrino::Helpers
    5 register Padrino::Admin::AccessControl
    6
    7 set :admin_model, 'Account'
    8 set :login_page, '/sessions/new'
    9
    10 enable :sessions
    11 disable :store_location
    12
    13 access_control.roles_for :any do |role|
    14 role.protect '/'
    15 role.allow '/sessions'
    16 end
    17
    18 access_control.roles_for :admin do |role|
    19 role.project_module :posts, '/posts'
    20 role.project_module :accounts, '/accounts'
    21 end
    22
    23 # Custom error management
    24 error(403) { @title = "Error 403"; render('errors/403', :layout => :error) }
    25 error(404) { @title = "Error 404"; render('errors/404', :layout => :error) }
    26 error(500) { @title = "Error 500"; render('errors/500', :layout => :error) }
    27 end
    28 end

    View Slide

  43. QBESJOPIFMQFST

    View Slide

  44. QBESJOPIFMQFST
    ϑΥʔϜ΍ϦϯΫɺը૾༻ͷλάͳͲ
    )5.-λάΛੜ੒͢Δϝιου͕࢖༻ՄೳʹͳΔ
    MJOL@UP΍JNBHF@UBHͳͲ3BJMTͱಉ͡Α͏ͳϝιου͕ఆٛ͞Ε͍ͯΔ
    input_tag :text, class: “demo”
    #=>
    ςϯϓϨʔτΛϨϯμϦϯά͢ΔͨΊͷϝιου
    SFOEFS QBSUJBM
    ͕࢖༻ՄೳʹͳΔ
    render ‘path/to/any/template'
    partial 'photo/_item', object: @photo, locals: { foo: 'bar' }

    View Slide

  45. QBESJOPDBDIF

    View Slide

  46. QBESJOPDBDIF
    ςϯϓϨʔτͷϨϯμϦϯά݁Ռ΍
    ೚ҙͷΦϒδΣΫτͷ಺༰ΛΩϟογϡͰ͖ΔΑ͏ʹͳΔ
    Ωϟογϡػߏͷϕʔεʹ͸.POFUB͕ར༻͞Ε͓ͯΓ
    σϑΥϧτͰ༷ʑͳΩϟογϡετΞ͕ར༻Մೳͱͳ͍ͬͯΔ
    1 Padrino.cache = Padrino::Cache.new(:LRUHash) # default choice
    2 Padrino.cache = Padrino::Cache.new(:File, dir: Padrino.root('tmp', app_name.to_s, 'cache'))
    3 Padrino.cache = Padrino::Cache.new(:Memcached, backend: memcached_or_dalli_instance)
    4 Padrino.cache = Padrino::Cache.new(:Redis, backend: redis_instance)
    5 Padrino.cache = Padrino::Cache.new(:Mongo, backend: mongo_client_instance)
    1 module SampleProject
    2 class App < Padrino::Application
    3 register Padrino::Cache
    4 enable :caching
    5
    6 get '/foo', cache: true do
    7 expires 10
    8 Time.now.to_s
    9 end
    10 end
    11 end

    View Slide

  47. QBESJOPNBJMFST

    View Slide

  48. QBESJOPNBJMFST
    γϯϓϧͳΠϯλʔϑΣʔεͰϝʔϧ഑৴͕ߦ͑ΔΑ͏ʹͳΔ
    ϑΝΠϧͷఴ෇΍Ϛϧνύʔτ΋Մೳ .BJMϕʔε

    1 class App < Sinatra::Base
    2 register Padrino::Mailer
    3
    4 set :delivery_method, smtp: {
    5 address: ‘smtp.gmail.com’,
    6 port: 587,
    7 domain: 'your.host.name',
    8 user_name: '',
    9 password: '',
    10 authentication: 'plain',
    11 enable_starttls_auto: true
    12 }
    13
    14 post :mail do
    15 email do
    16 from: "[email protected]",
    17 to: "[email protected]",
    18 subject: "Welcome!",
    19 body: "This is test mail."
    20 end
    21 end
    22
    23 end
    1 module Sample
    2 class App < Padrino::Application
    3 register Padrino::Mailer
    4
    5 set :delivery_method, :sendmail
    6
    7 mailer :sample do
    8 email :welcome do
    9 from "[email protected]"
    10 to "[email protected]"
    11 subject "Welcome!"
    12 add_file "/path/to/someotherfile.png"
    13 provides :html, :plain
    14 render "sample"
    15 end
    16 end
    17
    18 post :mail do
    19 deliver :sample, :welcome
    20 end
    21
    22 end
    23 end

    View Slide

  49. QBESJOPTVQQPSU

    View Slide

  50. QBESJOPTVQQPSU
    QBESJOPΛαϙʔτ͢ΔͨΊͷϥΠϒϥϦू
    4USJOHͷ֦ு DPMPSJ[F QMVSBMJ[F
    ΍
    ࠃࡍԽରԠ༻ͷZBNMϑΝΠϧ͕ஔ͍ͯ͋Δ
    Ұ෦ͷϝιου͸"DUJWF4VQQPSUͷ΋ͷΛͦͷ··ར༻͍ͯ͠Δ

    View Slide

  51. ·ͱΊ

    View Slide

  52. ·ͱΊ
    1BESJOPͱ͸ɺ
    4JOBUSBͷ؆ܿ͞Λอͪͭͭɺ
    ෳࡶͳΞϓϦέʔγϣϯ։ൃʹඞཁͱͳΔΑ͏ͳػೳΛ
    ඞཁͳͱ͖ʹ෇͚Ճ͑Δࣄ͕Ͱ͖ΔΑ͏ʹͨ͠
    8FCΞϓϦέʔγϣϯϑϨʔϜϫʔΫ
    "HOPTUJD
    03.΍ςϯϓϨʔτΤϯδϯͳͲΛࣗ༝ʹ૊Έ߹ΘͤՄೳ
    .PVOUBCMF
    খ͞ͳ3BDLΞϓϦέʔγϣϯΛࣗ༝ʹ૊Έ߹ΘͤՄೳ

    View Slide

  53. View Slide

  54. ୈ෦
    1BESJOPΛ࢖ͬͨ։ൃͷ࣮ફ
    1BESJOPͰ։ൃΛߦ͏ࡍͷ5JQT΍
    ໰୊ͷղܾํ๏ͳͲΛઆ໌͠·͢ɻ

    View Slide

  55. 1BESJOPͷΤίγεςϜ

    View Slide

  56. 1BESJOPͷΤίγεςϜ
    3BDLϛυϧ΢ΣΞ
    SBDLDPOUSJC
    4JOBUSBͷػೳ֦ு 4JOBUSB&YUFOUJPO

    TJOBUSBDPOUSJC
    1BESJOPͷػೳ֦ு 1BESJOP༻ͷ4JOBUSB&YUFOUJPO

    QBESJOPDPOUSJC
    1BESJOPͷϓϥάΠϯػೳ
    QBESJOPSFDJQFTʹެࣜͷϨγϐ͕ެ։͞Ε͍ͯΔ

    View Slide

  57. 1BESJOPͷΤίγεςϜ
    3BDLϛυϧ΢ΣΞ
    SBDLDPOUSJC
    4JOBUSBͷػೳ֦ு 4JOBUSB&YUFOUJPO

    TJOBUSBDPOUSJC
    1BESJOPͷػೳ֦ு 1BESJOP༻ͷ4JOBUSB&YUFOUJPO

    QBESJOPDPOUSJC
    1BESJOPͷϓϥάΠϯػೳ
    QBESJOPSFDJQFTʹެࣜͷϨγϐ͕ެ։͞Ε͍ͯΔ

    View Slide

  58. 1BESJOPͷϓϥάΠϯػೳ 5FNQMBUFT

    ϓϩδΣΫτͷ࡞੒खॱ͕هड़͞ΕͨςϯϓϨʔτϑΝΠϧΛݩʹ
    ৽͍͠1BESJOPϓϩδΣΫτΛੜ੒͢Δ͜ͱ͕Ͱ͖Δ
    QBESJOPHQSPKFDUTBNQMFUFNQMBUFQBUIUPNZ@UFNQMBUFSC

    View Slide

  59. 1BESJOPͷϓϥάΠϯػೳ 5FNQMBUFT

    View Slide

  60. 1BESJOPͷϓϥάΠϯػೳ 1MVHJOT

    ϨγϐϑΝΠϧΛݩʹɺ
    طଘͷ1BESJOPϓϩδΣΫτʹػೳ௥Ճ͕ߦ͑Δ
    QBESJOPHQMVHJOQBUIUPNZ@QMVHJOSC

    View Slide

  61. 1BESJOPͷϓϥάΠϯػೳ 1MVHJOT

    View Slide

  62. ͦͷଞ
    0NOJ"VUI 8BSEFO
    KQNPCJMF #SPXTFS
    XJMM@QBHJOBUF ,BNJOBSJ
    #FUUFS&SSPST
    4JOBUSBͰ࢖͑Δ΋ͷ͸ී௨ʹ࢖͑Δ
    QBESJOPQJQFMJOF QBESPOJBTTFUT
    1BESJOPʹಛԽͨ͠΋ͷ΋͋Δ

    View Slide

  63. 1BESJOPΛ࢖͍ͬͯ͘ͱ
    ૺ۰͢Δ໰୊

    View Slide

  64. 1BESJOPΛ࢖͍ͬͯ͘ͱૺ۰͢Δ໰୊
    ίʔυͷංେԽ
    ֤छίϚϯυͰͷىಈ͕஗͘ͳΔ
    ։ൃαʔόىಈޙ͸Ϧϩʔμʔ͕Կͱ͔ͯ͘͠ΕΔ͕ʜ
    4QSJOH͸3BJMT༻ͩ͠4QPSL͸ϝϯς͞Ε͍ͯͳ͍
    4JOBUSBͷ఩ֶʹै͍খ͞ͳ෦඼ʹ෼ׂͰ͖ͳ͍͔
    αϒΞϓϦέʔγϣϯ
    ΞϓϦέʔγϣϯͷHFNԽ

    View Slide

  65. 1BESJOPෳ਺ΞϓϦߏ੒ͷαϯϓϧ

    View Slide

  66. 1BESJOPͷ৘ใݯ

    View Slide

  67. 1BESJOPͷ৘ใݯ ެࣜϖʔδ

    View Slide

  68. 1BESJOPͷ৘ใݯ ެࣜυΩϡϝϯτ

    View Slide

  69. 1BESJOPͷ৘ใݯ FCPPL

    View Slide

  70. 1BESJOPͷ৘ใݯ ॻ੶ɾࡶࢽ

    View Slide

  71. 1BESJOPͷ৘ใݯ Δͼ·

    ߸

    View Slide

  72. 1BESJOPͷ৘ใݯ ͦͷଞ

    View Slide

  73. 1BESJOPͷ৘ใݯ ͦͷଞ

    View Slide

  74. 1BESJOPͷ৘ใݯ ͦͷଞ

    View Slide

  75. 1BESJOPͷ৘ใݯ ίʔυ

    View Slide

  76. 1BESJOPͷ৘ใݯ JEPCBUB

    1BESJOPʹ͍ͭͯࡶஊͰ͖Δ৔ॴ͕ཉ͔ͬͨ͠ͷͰ࡞ͬͨ
    IUUQTJEPCBUBJPPSHBOJ[BUJPOTQBESJOPGSBNFXPSLKQSPPNTQVCMJDKPJO@SFRVFTU
    CEEBDGEDDC

    View Slide

  77. 1BESJOPͷࠓޙ

    View Slide

  78. 1BESJOPͷࠓޙ
    1BESJOP΁޲͚ͯ
    ϚϧνεϨουͷαϙʔτ
    ৽͍͠ϧʔλʔͷಋೖ
    1BESJOP"ENJOͷ࡮৽
    ϖʔδωʔγϣϯɺݕࡧɾϑΟϧλɺμΠφϛοΫͳ6*ͳͲ
    ϦϑΝΫλϦϯά
    ϦϩʔμʔɺϩΨʔ
    υΩϡϝϯτͷ੔උ
    ґଘΛগͳ͘ɺΑΓݎ࿚ͰΑΓߴ଎ͳϑϨʔϜϫʔΫΛ໨ࢦ͢
    3BDL 4JOBUSBͷಈ޲΋஫໨

    View Slide

  79. 1BESJOPͷࠓޙ

    View Slide

  80. ࠷ޙʹ

    View Slide

  81. 1BESJOP΁ͷߩݙ
    υΩϡϝϯτ
    ίʔυͷதɺެࣜυΩϡϝϯτɺ೔ຊޠ
    ϓϥάΠϯ
    ಈ͔ͳ͍΋ͷ΁ͷύονɺࣗ෼ͷཉ͍͠΋ͷ
    HFN
    3BDLϛυϧ΢ΣΞɺ4JOBUSB&YUFOUJPOɺ1BESJOPઐ༻
    ίʔυ
    ίϝϯτमਖ਼ɺόάमਖ਼ɺ৽ػೳͷఏҊ

    View Slide

  82. View Slide

  83. ͓·͚

    View Slide

  84. ͦͷଞͷ3VCZ੡
    8FC"QQMJDBUJPO'SBNFXPSL
    ݸਓతʹؾʹͳ͍ͬͯΔ΋ͷ

    View Slide

  85. View Slide

  86. View Slide

  87. View Slide

  88. ຖ݄ୈ̏ਫ༵։࠵
    ौ୩पลͰ։࠵ ෆఆ

    IUUQTIJCVZBSCEPPSLFFQFSKQ

    View Slide