Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちょっとわかるrack
Search
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
190
Ruby_Committers_and_the_World_-_RubyKaigi_2025.pdf
lchin
0
12
Ruby Committers and the World - RubyKaigi 2024
lchin
0
9
生鮮ECのタイムセールを 耐え抜いてきた話 / Handling high traffic sale days at Cookpad Mart
lchin
3
13k
Performance as a Product Feature
lchin
5
2.1k
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
Dockerfile CMD for Node.js
grazie1999
0
140
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
120
高専キャリア LT 発表内容
crysta1221
4
4.2k
リアルな遅延を測る仕様
kota_yata
1
130
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
310
使いながら育てる Claude Code — 開発フローの1コマンド化 × 繰り返し指摘の自動仕組み化
shiki_kakaku
1
2k
まずはプロンプトガイドを読もう、話はそれからだ
kiakiraki
1
230
ドリフトを絶対に許さない(?)CDK運用 / CDK Ops with Zero Tolerance for Drifts (?)
akihisaikeda
1
240
30年振りにコンパイラの定数整数除算を改善した
herumi
9
4.3k
React本体のコードリーディング
high_g_engineer
1
160
バグを直したら useEffect が消えた
colorful12
3
760
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
130
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
14k
Rails Girls Zürich Keynote
gr2m
96
14k
Done Done
chrislema
186
16k
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
The Art of Programming - Codeland 2020
erikaheidi
57
14k
Into the Great Unknown - MozCon
thekraken
41
2.7k
Money Talks: Using Revenue to Get Sh*t Done
nikkihalliwell
0
480
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
670
Are puppies a ranking factor?
jonoalderson
2
3.8k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
310
Data-driven link building: lessons from a $708K investment (BrightonSEO talk)
szymonslowik
1
1.3k
CSS Pre-Processors: Stylus, Less & Sass
bermonpainter
360
30k
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͞ΕͯΔ