Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Speaker Deck
PRO
Sign in
Sign up for free
Best Rails Book You've Never Read
DamirSvrtan
June 23, 2016
Programming
0
98
Best Rails Book You've Never Read
A presentation on all the benefits you gain after reading Rebuilding Rails by Noah Gibbs.
DamirSvrtan
June 23, 2016
Tweet
Share
More Decks by DamirSvrtan
See All by DamirSvrtan
Designing APIs: Less Data is More
damirsvrtan
1
320
Crossing Domain Boundaries with GraphQL
damirsvrtan
0
68
Surrounded by Microservices
damirsvrtan
2
4.1k
Building Serverless Ruby Bots @ Ruby Conf 2018
damirsvrtan
0
170
Building Serverless Ruby Bots @ Paris.rb Conf 2018
damirsvrtan
1
1.5k
Importing and serving millions of records
damirsvrtan
1
75
Stateless authentication w/ JSON Web Tokens
damirsvrtan
5
240
Building Ruby Bots on AWS Lambda
damirsvrtan
0
800
Reinventing The Bootcamp Idea
damirsvrtan
0
110
Other Decks in Programming
See All in Programming
インフラエンジニアの多様性と評価、またはキャリアへのつなげ方 / Careers as infrastructure engineers
katsuhisa91
0
340
スモールチームがAmazon Cognitoでコスパよく作るサービス間連携認証
tacke_jp
2
290
A technique to implement DSL in Ruby
okuramasafumi
0
640
競プロへの誘 -いざな-
u76ner
0
350
WindowsコンテナDojo : 第1回 Visual StudioでWindowsコンテナアプリ作成
oniak3ibm
PRO
0
330
Swift Concurrencyによる安全で快適な非同期処理
tattn
2
300
クリエイティブ系のウェブサイト制作で役立つCSS技法 / CSS for develop creative website
clockmaker
2
1.5k
UI State Modeling 어떤게 좋을까?
laco2951
1
220
実録mruby組み込み体験
coe401_
0
100
SRE NEXT 2022: Sensible Incident Management for Software Startups
takanabe
2
270
Jakarta EE 10 is Coming Your Way
ivargrimstad
0
2.3k
コードの解析と言語習得の心得
jinjin33333
0
130
Featured
See All Featured
A better future with KSS
kneath
225
15k
GraphQLの誤解/rethinking-graphql
sonatard
24
6.2k
Large-scale JavaScript Application Architecture
addyosmani
499
110k
BBQ
matthewcrist
74
7.9k
Building Your Own Lightsaber
phodgson
94
4.6k
Designing for humans not robots
tammielis
241
23k
Art, The Web, and Tiny UX
lynnandtonic
280
17k
Building an army of robots
kneath
299
40k
Code Review Best Practice
trishagee
41
6.7k
Creating an realtime collaboration tool: Agile Flush - .NET Oxford
marcduiker
3
430
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
38
12k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
103
16k
Transcript
The best Rails book you’ve never read. DAMIR SVRTAN
01 RUBY/RAILS BOOKS
WELL KNOWN BOOKS POODR Sandi Metz RoR Tutorial Michael Hartl
Pickaxe David Thomas Metaprogramming Ruby Paolo Perrotta
and many more..
02 REBUILDING RAILS
None
NOAH GIBBS
Get your hands dirty and build your own Ruby Web
Framework - NOAH GIBBS
RAILS INTERNALS CAN TEACH YOU A LOT…
NOT JUST READING - ALSO LOTS OF CODING
BUILD YOUR OWN GEM bundler new my_framework
PUBLISH YOUR FIRST GEM push it to rubygems.org
LEARN HOW RACK WORKS what is Rack?
Browser App Server RACK Ruby App
ALMOST EVERY RUBY FRAMEWORK USES IT! Rails, Sinatra, Hanami, Roda..
# config.ru require 'rack' class MyApp def call(env) [200, {
'Content-Type' => 'text/html' }, ["Hello World"]] end end run MyApp.new
run object.call
run proc { |env| [200, { 'Content-Type' => 'text/html' },
[Time.now] }
# config.ru require 'rack' class MyApp def call(env) [200, {
'Content-Type' => 'text/html' }, ["Hello World"]] end end run MyApp.new
env argument
{ "SERVER_SOFTWARE"=>"THIN 1.6.3 CODENAME PROTEIN POWDER", "SERVER_NAME"=>"LOCALHOST", "RACK.INPUT"=>#<STRINGIO:0X007FFD50C4A9C8>, "RACK.VERSION"=>[1, 0],
"RACK.ERRORS"=>#<IO:<STDERR→, "RACK.MULTITHREAD"=>FALSE, "RACK.MULTIPROCESS"=>FALSE, "RACK.RUN_ONCE"=>FALSE, "REQUEST_METHOD"=>"GET", "REQUEST_PATH"=>"/", "PATH_INFO"=>"/", "REQUEST_URI"=>"/", "HTTP_VERSION"=>"HTTP/1.1", "HTTP_HOST"=>"LOCALHOST:3000", "HTTP_CONNECTION"=>"KEEP-ALIVE", "HTTP_CACHE_CONTROL"=>"MAX-AGE=0", "HTTP_UPGRADE_INSECURE_REQUESTS"=>"1", "HTTP_USER_AGENT"=>"MOZILLA/5.0 (MACINTOSH; INTEL MAC OS X 10_11_3) APPLEWEBKIT/537.36 (KH™L, LIKE GECKO) CHROME/51.0.2704.103 SAFARI/537.36", "HTTP_ACCEPT"=>"TEXT/H™L,APPLICATION/XH™L+XML,APPLICATION/XML;Q=0.9,IMAGE/WEBP,*/*;Q=0.8", "HTTP_ACCEPT_ENCODING"=>"GZIP, DEFLATE, SDCH", "HTTP_ACCEPT_LANGUAGE"=>"EN-US,EN;Q=0.8", "HTTP_COOKIE"=> "", "GATEWAY_INTERFACE"=>"CGI/1.2", "SERVER_PORT"=>"3000", "QUERY_STRING"=>"", "SERVER_PROTOCOL"=>"HTTP/1.1", "RACK.URL_SCHEME"=>"HTTP", "SCRIPT_NAME"=>"", "REMOTE_ADDR"=>"127.0.0.1" }
# config.ru require 'rack' class MyApp def call(env) [200, {
'Content-Type' => 'text/html' }, ["Hello World"]] end end run MyApp.new
[200, { 'Content-Type' => 'text/html' }, ["Hello World”]]
use Rack::Session::Cookie, :secret => 'abc123' use BetterErrors::Middleware if Noodles.env.development? use
Rack::CommonLogger, $stdout use Rack::ContentType use Rack::MethodOverride use Rack::Static, urls: ["/css", "/images", "/js", "/favicon.ico"], root: "public" run Noodles.application
BUILD YOUR OWN ROUTER
Noodles.http_app.routes do root_to 'home#index' get 'chat', 'chat#index' get "auth/:provider/callback", 'session#success'
get "auth/failure", 'session#failure' post "rooms", "rooms#create" delete "logout", 'session#logout' resources :users end
BUILD YOUR OWN CONTROLLERS
class RoomsController < BaseController def create room = Room.new(name: params['name'],
public: true) room.save! redirect_to ‘/' end end
HOW TO LOAD CONTROLLERS?
HOW TO LOAD RAILS CONTROLLERS? Rails magic autoloading
require ‘users_controller’
$LOAD_PATH
puts $LOAD_PATH [ "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/eventmachine-1.0.7/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/daemons-1.1.9/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/thin-1.6.3/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/rack-1.6.4/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/slop-3.6.0/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/method_source-0.8.2/lib",
"/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-0.10.3/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/coderay-1.1.1/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/pry-byebug-3.3.0/lib", "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/byebug-8.2.4/lib" ]
puts $LOAD_PATH [ "/Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib" ] ls /Users/damirsvrtan/.rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/did_you_mean-1.0.0/lib/did_you_mean core_ext formatter.rb spell_checkable.rb
version.rb extra_features jaro_winkler.rb spell_checkers extra_features.rb levenshtein.rb verbose_formatter.rb require 'did_you_mean/extra_features'
None
controllers_folder_path = File.join("app", "controllers") $LOAD_PATH << controllers_folder_path
method_missing?
const_missing?
class Object def self.const_missing(constant) require Noodles.to_underscore(constant.to_s) Object.const_get(constant) end end Admin::UsersController
-> admin/users_controller
Learn how redirects work (30× status)
Learn how render and ERB work (use haml, slim, tilt)
Learn how cookies work
class UsersController < ApplicationController def index cookies[:favorite_color] ||= :black end
end
class UsersController < ApplicationController def index unless request.cookies[:favorite_color] == :black
response.headers.push('Set-Cookie', 'favorite_color=black') end end end
Build your own small ORM
03 BENEFITS
REINVENTING THE WHEEL
BETTER GRASP ON RAILS, RACK, GEMS & THE HTTP LAYER
None
Any questions? DAMIR.SVRTAN@INFINUM.CO @DAMIRSVRTAN Visit infinum.co or find us on
social networks: infinum.co infinumco infinumco infinum