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
58
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
damirsvrtan
0
30
damirsvrtan
2
3.2k
damirsvrtan
0
90
damirsvrtan
1
1.4k
damirsvrtan
1
40
damirsvrtan
5
220
damirsvrtan
0
710
damirsvrtan
0
89
damirsvrtan
0
120
Other Decks in Programming
See All in Programming
anchorcable
1
130
zsmb
2
110
sullis
0
120
o0h
PRO
1
1.5k
azdaroth
0
170
taoshotaro
1
370
mizdra
7
4.9k
tommykw
1
350
hirotokirimaru
1
430
nauleyco
0
210
kazuki19992
0
450
saki4869
0
190
Featured
See All Featured
chriscoyier
145
19k
robhawkes
52
2.8k
chriscoyier
499
130k
rasmusluckow
318
18k
michaelherold
225
8.5k
searls
204
35k
garrettdimon
287
110k
jnunemaker
PRO
40
4.6k
chriscoyier
780
240k
reverentgeek
27
1.9k
jeffersonlam
328
15k
jasonvnalue
82
8.1k
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