Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ちょっとわかるrack
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
Leonard Chin
May 24, 2012
Programming
1.3k
10
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ちょっとわかるrack
初心者向けrackの簡単な紹介
・rackとは何か
・rackアプリの作り方
・rack middlewareの作り方・使い方
※2012/5/14の会社内LTで使用した資料
Leonard Chin
May 24, 2012
More Decks by Leonard Chin
See All by Leonard Chin
Ruby Committers and the World - RubyKaigi 2026
lchin
0
220
Ruby_Committers_and_the_World_-_RubyKaigi_2025.pdf
lchin
0
22
Ruby Committers and the World - RubyKaigi 2024
lchin
0
17
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic sale days at Cookpad Mart
lchin
3
13k
Performance as a Product Feature
lchin
5
2.2k
Database Performance for Ruby on Rails Applications
lchin
7
1.4k
Database Performance for Rails Applications
lchin
5
750
How to Survive and thrive as an engineer in a foreign land
lchin
4
1.3k
#eachを使ったら負け
lchin
7
1.7k
Other Decks in Programming
See All in Programming
[Rails World 2026] Durable orchestration on Rails: from continuation to workflow
palkan
1
750
Herb in Rails 8.2: Your ERB views, now HTML-aware @ Rails World 2026, Austin, Texas
marcoroth
0
220
ハーネス設計入門 〜 基礎知識の整理から実務へのステップアップ 〜
kinopeee
28
32k
當我們開始不讀 Code - AI Agent 時代,Code Review 與 Clean Code 還剩下什麼?
jame2408
1
190
When benchmarks go bad - what I learned from measuring performance wrong
hollycummins
0
220
HTML-in-Canvasで作る未来のWeb UI表現
clockmaker
5
5.1k
複雑なUIコンポーネントとの ⻑い付き合い⽅:波及するバグからテスト戦略を経て、安全な再設計へ
mixplace
0
410
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
270
sbt 2.0: takeoff
eed3si9n
0
160
ChromeでローカルLLM
ryu1013
0
140
パスワード再設定メールのURLについて知っておこう
uyuki234
0
160
AWS CDKのカスタムリソースでContinuum(旧Security Agent)を実装した話 | Implementing Continuum (formerly Security Agent) via AWS CDK Custom Resource
akihisaikeda
2
150
Featured
See All Featured
Making the Leap to Tech Lead
cromwellryan
135
10k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
The Cost Of JavaScript in 2023
addyosmani
55
10k
Bioeconomy Workshop: Dr. Julius Ecuru, Opportunities for a Bioeconomy in West Africa
akademiya2063
PRO
1
410
The Power of CSS Pseudo Elements
geoffreycrofte
82
6.6k
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.4k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
450
The Cult of Friendly URLs
andyhume
79
7k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
520
Documentation Writing (for coders)
carmenintech
77
5.6k
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
340
How to Talk to Developers About Accessibility
jct
2
580
Transcript
ͪΐͬͱΘ͔Δ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ͜ͷ*'ɺͲ͏͢Δʁ
Web Server App Server IUUQ DBMMSVCZ DBMMBQQ Your App BQBDIFOHJOYFUD
QBTTFOHFSNPOHSFMUIJOFUD ڞ௨*'3BDL 3BDL"QQMJDBUJPO
call(env)
def call(env) ... end 3FRVFTUΛ͞ΕΔ 3FTQPOTFΛฦ͢ [status, headers, response_body]
ৄࡉ41&$Ͱ http://rack.rubyforge.org/doc/SPEC.html
4JOBUSBͷ߹
# Rack call interface. def call(env) dup.call!(env) end attr_accessor :env,
:request, :response, :params def call!(env) # :nodoc: @env = env @request = Request.new(env) @response = Response.new @params = indifferent_params(@request.params) template_cache.clear if settings.reload_templates force_encoding(@params) @response['Content-Type'] = nil invoke { dispatch! } invoke { error_block!(response.status) } unless @response['Content-Type'] if Array === body and body[0].respond_to? :content_type content_type body[0].content_type else content_type :html end end @response.finish end
SBDLVQ
rackup config.ru ΞϓϦͷೖΓޱΛఆٛ Rack::Builder.new { <config.ru> }.to_app ʹ͢
#config.ru require ‘rack’ require ‘myapp’ run MyApp.new 3BDL"QQMJDBUJPO JFJNQMFNFOUTcall(env)
# Minimum config.ru require ‘rack’ run lambda { |env| [200,
{ "Content-Type" => "text/plain" }, ["OK"] ] } TUBUVT IFBEFST CPEZ
3BDL.JEEMFXBSF
Web Server App Server IUUQ DBMMSVCZ Your App BQBDIFOHJOYFUD QBTTFOHFSNPOHSFMUIJOFUD
3BDL*' 3BDL"QQMJDBUJPO Middleware Middleware 3BDL*' 3BDL*' .JEEMFXBSFΛૠೖ ^
w $43' w 3FEJSFDUJPO w -PHHJOH w 4FTTJPO.BOBHFNFOU w "VUIFOUJDBUJPO
w &NCFE(PPHMF"OBMZUJDT FUD
class Middleware def initialize(app) @app = app end def call(env)
# do something response = @app.call(env) # do something end end ࣍ʹݺͿ"QQ.JEEMFXBSF 3FRVFTUΛ͍͡Δ 3FTQPOTFΛ͍͡Δ
&YBNQMFSBDL@DTSG
def call(env) unless env['rack.session'] raise SessionUnavailable.new('Rack::Csrf depends on session middleware')
end self.class.token(env) req = Rack::Request.new(env) untouchable = skip_checking(req) || !@http_methods.include?(req.request_method) || req.params[self.class.field] == env['rack.session'][self.class.key] || req.env[self.class.rackified_header] == env['rack.session'][self.class.key] if untouchable @app.call(env) else raise InvalidCsrfToken if @raisable [403, {'Content-Type' => 'text/html', 'Content-Length' => '0'}, []] end end $43'νΣοΫࣦഊͨ͠Βɺ ͙͢ʹ3FTQPOTFฦ͢ 3FRVFTUʹ$43'ରࡦUPLFOΛνΣοΫ ௨ͬͨΒɺͦͷ··࣍
6TJOH.JEEMFXBSF
#config.ru require ‘rack’ require ‘myapp’ class Middleware def initialize(app) @app
= app end def call(env) env["rack.some_header"] = "setting an example" @app.call(env) end end use Middleware run MyApp.new 3BDL෦Ͱ!VTFྻʹૠೖ 3BDL#VJMEFSʹCJOE͞ΕͯΔ