Upgrade to Pro — share decks privately, control downloads, hide ads and more …

初めてのPadrino

Avatar for Takeshi Yabe Takeshi Yabe
December 11, 2014

 初めてのPadrino

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

Avatar for Takeshi Yabe

Takeshi Yabe

December 11, 2014
Tweet

More Decks by Takeshi Yabe

Other Decks in Technology

Transcript

  1. ΫϥγοΫελΠϧ 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
  2. NZQSPKFDU ᵓᴷᴷ(FNpMF ᵓᴷᴷ(FNpMFMPDL ᵓᴷᴷ3BLFpMF ᵓᴷᴷBQQSC ᵓᴷᴷDPOpH ᴹᵋᴷᴷEBUBCBTFSC ᵓᴷᴷDPOpHSV ᵓᴷᴷEC ᴹᵋᴷᴷEFWFMPQNFOUEC

    ᵓᴷᴷMPH ᴹᵋᴷᴷEFWFMPQNFOUMPH ᵓᴷᴷNBJMFSSC ᵓᴷᴷQVCMJD ᴹᵓᴷᴷKBWBTDSJQUT ᴹᴹᵋᴷᴷBQQKT ᴹᵋᴷᴷTUZMFTIFFUT ᴹᵋᴷᴷBQQDTT ᵋᴷᴷWJFXT ᵓᴷᴷJOEFYTMJN ᵋᴷᴷMBZPVUTMJN  σΟϨΫτϦߏ଄  %#ͷઃఆ  ϩάͷઃఆ  ϔϧύʔϝιου  )5.-Τεέʔϓ  ηογϣϯ  ςετ؀ڥ  ίϯιʔϧͰͷಈ࡞֬ೝ  3BLFλεΫ  ͳͲͳͲ ָ͍ͨ͠ 4JOBUSB
  3. 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 Λ։ൃ
  4. 1BESJOPͷओͳػೳ  δΣωϨʔλؚΉίϚϯυϥΠϯπʔϧ  αϒΞϓϦέʔγϣϯ  ଞͷ3BDLΞϓϦέʔγϣϯͷϚ΢ϯτ  ϧʔςΟϯάͷ֦ு 

    .7$ύλʔϯͷಋೖ  ๛෋ͳϔϧύʔϝιου  ؆୯ͳϝʔϧૹ৴ػೳ  Ωϟογϡػೳ  ࠃࡍԽػೳ  ଞͷϥΠϒϥϦͱ࿈ܞՄೳͳϩΨʔ  ։ൃ࣌ͷϦϩʔμʔ
  5. 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ϛυϧ΢ΣΞͷొ࿥
  6. 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 ϧʔςΟϯάͷ֦ுʢҰྫʣ ໊લ෇͖ϧʔτɺςϯϓϨʔτΤϯδϯͷࣗಈݕग़
  7. - project - app - mailer - controller - helper

    - model - migration - plugin - component - task - admin - admin_page QBESJOPHFO ৽͍͠1BESJOPϓϩδΣΫτͷ࡞੒࣌΍ طଘͷ1BESJOPϓϩδΣΫτ΁ ؆୯ʹίʔυΛ௥Ճ͢Δ͜ͱ͕Ͱ͖ΔΑ͏ʹͳΔ
  8. 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
  9. 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
  10. 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 ඞཁʹͳͬͨͱ͖ʹ ඞཁͳ΋ͷΛ௥ՃͰ͖Δ
  11. 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(‘/') Ϛ΢ϯτͷઃఆͰɺҰகͤ͞Δύε΍ϗετ໊ΛࢦఆͰ͖Δ
  12. 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 ؅ཧΞϓϦ͸αϒΞϓϦέʔγϣϯͱͯ͠ Ϛ΢ϯτ͢Δ
  13. 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
  14. QBESJOPIFMQFST ϑΥʔϜ΍ϦϯΫɺը૾༻ͷλάͳͲ )5.-λάΛੜ੒͢Δϝιου͕࢖༻ՄೳʹͳΔ MJOL@UP΍JNBHF@UBHͳͲ3BJMTͱಉ͡Α͏ͳϝιου͕ఆٛ͞Ε͍ͯΔ input_tag :text, class: “demo” #=> <input

    type='text' class='demo' /> ςϯϓϨʔτΛϨϯμϦϯά͢ΔͨΊͷϝιου SFOEFS QBSUJBM ͕࢖༻ՄೳʹͳΔ render ‘path/to/any/template' partial 'photo/_item', object: @photo, locals: { foo: 'bar' }
  15. 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
  16. 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: '<username>', 9 password: '<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
  17. 1BESJOPͷΤίγεςϜ  3BDLϛυϧ΢ΣΞ  SBDLDPOUSJC  4JOBUSBͷػೳ֦ு 4JOBUSB&YUFOUJPO  

    TJOBUSBDPOUSJC  1BESJOPͷػೳ֦ு 1BESJOP༻ͷ4JOBUSB&YUFOUJPO   QBESJOPDPOUSJC  1BESJOPͷϓϥάΠϯػೳ  QBESJOPSFDJQFTʹެࣜͷϨγϐ͕ެ։͞Ε͍ͯΔ
  18. 1BESJOPͷΤίγεςϜ  3BDLϛυϧ΢ΣΞ  SBDLDPOUSJC  4JOBUSBͷػೳ֦ு 4JOBUSB&YUFOUJPO  

    TJOBUSBDPOUSJC  1BESJOPͷػೳ֦ு 1BESJOP༻ͷ4JOBUSB&YUFOUJPO   QBESJOPDPOUSJC  1BESJOPͷϓϥάΠϯػೳ  QBESJOPSFDJQFTʹެࣜͷϨγϐ͕ެ։͞Ε͍ͯΔ
  19. ͦͷଞ  0NOJ"VUI 8BSEFO  KQNPCJMF #SPXTFS  XJMM@QBHJOBUF ,BNJOBSJ

     #FUUFS&SSPST 4JOBUSBͰ࢖͑Δ΋ͷ͸ී௨ʹ࢖͑Δ  QBESJOPQJQFMJOF QBESPOJBTTFUT 1BESJOPʹಛԽͨ͠΋ͷ΋͋Δ
  20. 1BESJOPͷࠓޙ 1BESJOP΁޲͚ͯ  ϚϧνεϨουͷαϙʔτ  ৽͍͠ϧʔλʔͷಋೖ  1BESJOP"ENJOͷ࡮৽  ϖʔδωʔγϣϯɺݕࡧɾϑΟϧλɺμΠφϛοΫͳ6*ͳͲ

     ϦϑΝΫλϦϯά  ϦϩʔμʔɺϩΨʔ  υΩϡϝϯτͷ੔උ ґଘΛগͳ͘ɺΑΓݎ࿚ͰΑΓߴ଎ͳϑϨʔϜϫʔΫΛ໨ࢦ͢ 3BDL 4JOBUSBͷಈ޲΋஫໨
  21. 1BESJOP΁ͷߩݙ  υΩϡϝϯτ  ίʔυͷதɺެࣜυΩϡϝϯτɺ೔ຊޠ  ϓϥάΠϯ  ಈ͔ͳ͍΋ͷ΁ͷύονɺࣗ෼ͷཉ͍͠΋ͷ 

    HFN  3BDLϛυϧ΢ΣΞɺ4JOBUSB&YUFOUJPOɺ1BESJOPઐ༻  ίʔυ  ίϝϯτमਖ਼ɺόάमਖ਼ɺ৽ػೳͷఏҊ