The Rich Get Richer: RAILS 3
PRESENTED BYOBIE FERNANDEZ
HASHROCKET
EXPERTLY CRAFTED WEB Sunday, December 5, 2010
The Rich Get Richer: RAILS 3 PRESENTED BY OBIE FERNANDEZ Sunday, - - PowerPoint PPT Presentation
HASHROCKET EXPERTLY CRAFTED WEB The Rich Get Richer: RAILS 3 PRESENTED BY OBIE FERNANDEZ Sunday, December 5, 2010 About 20k USD Sunday, December 5, 2010 About 45k USD Sunday, December 5, 2010 About 200k USD Sunday, December 5, 2010 a
The Rich Get Richer: RAILS 3
PRESENTED BYOBIE FERNANDEZ
HASHROCKET
EXPERTLY CRAFTED WEB Sunday, December 5, 2010About 20k USD
Sunday, December 5, 2010About 45k USD
Sunday, December 5, 2010About 200k USD
Sunday, December 5, 2010“a few million dollars”
Sunday, December 5, 2010OMG RAILS 3 ROCKS SO MUCH MORE THAN RAILS 2!!!
PRESENTED BYOBIE FERNANDEZ
HASHROCKET
EXPERTLY CRAFTED WEB Sunday, December 5, 2010CAUTION: JUST A METAPHOR
How is Rails 3 Richer?
mainstream adoption maturity performance
The Rich Get Richer: RAILS 3
Presentation Overview
Ezra Zygmuntovich
Sunday, December 5, 2010merb [...] clocks in at 17,291 [loc]. Rails clocks in at 47,195. As you can see, it’s a tie.
Sunday, December 5, 2010Yehuda Katz
Sunday, December 5, 2010David Heinemeir Hansson
Sunday, December 5, 2010Tom Mornini
Sunday, December 5, 2010Tom Mornini
Sunday, December 5, 2010Q: How do you prevent bloating?
Ryan Sanchez's "Violet Beauregarde" ("Charlie and the Chocolate Factory")
Photo by Tera Heater/ MTV News Sunday, December 5, 2010A: Decoupling
http://yestheykeepmebusy.blogspot.com/2009/11/willy-wonka- halloween.html Sunday, December 5, 2010A: Modularity
http://superpunch.blogspot.com/2009/10/lego-violet-beauregarde-and- more.html
Sunday, December 5, 2010require 'active_support/concern' require 'active_support/ordered_options' require 'active_support/core_ext/kernel/singleton_class' require 'active_support/core_ext/module/delegation' module ActiveSupport # Configurable provides a <tt>config</tt> method to store and retrieve # configuration options as an <tt>OrderedHash</tt>. module Configurable extend ActiveSupport::Concern class Configuration < ActiveSupport::InheritableOptions def compile_methods! self.class.compile_methods!(keys.reject {|key| respond_to?(key)}) end # compiles reader methods so we don't have to go through method_missing def self.compile_methods!(keys) keys.each do |key| class_eval <<-RUBY, __FILE__, __LINE__ + 1 def #{key}; _get(#{key.inspect}); end RUBY end end end ...
Sunday, December 5, 2010The Rich Get Richer: RAILS 3
Notable Plugin Changes
config/routes.rb
Sunday, December 5, 2010# This file is used by Rack-based servers to start the application. require ::File.expand_path('../config/environment', __FILE__) run Example::Application
config.ru
Sunday, December 5, 2010Rack::Cache ActionDispatch::Static Rack::Lock Rack::Runtime Rails::Rack::Logger ActionDispatch::ShowExceptions ActionDispatch::RemoteIp Rack::Sendfile ActionDispatch::Callbacks ActionDispatch::Cookies ActionDispatch::Flash ActionDispatch::ParamsParser Rack::MethodOverride ActionDispatch::Head Rack::ConditionalGet Rack::ETag ActionDispatch::BestStandardsSupport
Rails 3 Middleware “Stack”
Sunday, December 5, 2010gem "rails", "3.0.1" gem 'jquery-rails' gem "mysql" gem "haml", "3.0.18" gem "decent_exposure", "1.0.0.rc1" gem "devise", "1.1.3" gem "chronic", "0.2.3" gem "seed-fu", "1.2.3", :git => "git://github.com/supaspoida/seed-fu.git" gem "block_helpers", "0.3.3" gem "will_paginate", "3.0.pre2" gem "geokit", "1.5.0" group :test do gem "capybara", "0.3.9" gem 'database_cleaner', '0.5.0' gem 'launchy', '0.3.7' gem "rspec-rails", "2.0.1" gem "mocha", "0.9.9" gem "shoulda", "2.11.3" gem "selenium-webdriver" gem "timecop", "0.3.5" gem "watchr" gem "specjour", "0.3.1" gem "email_spec", "1.0.0" end
Gemfile
Sunday, December 5, 2010$ bundle Fetching source index for http://rubygems.org Using rake (0.8.7) Using abstract (1.0.0) Using activesupport (3.0.1) Using builder (2.1.2) Using i18n (0.4.2) Using activemodel (3.0.1) ... Your bundle is complete! It was installed into /Users/obie/.rvm/gems/ruby-1.9.2- p0@example-application
Sunday, December 5, 2010by Nick Kallen
Sunday, December 5, 2010User.find :conditions => { :name => "obie" } # in Rails 3 becomes User.where(:name => "obie")
Sunday, December 5, 2010>> u = User.where(first_name: "Pascale"); u.to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') >> u.where(age: 21).to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') AND (`users`.`age` = 21)" >> u.order(:name).limit(20).to_sql => "SELECT `users`.* FROM `users` WHERE (`users`.`first_name` = 'Pascale') ORDER BY name LIMIT 20"
Sunday, December 5, 2010class Invitation < ActiveRecord::Base default_scope order("created_at DESC") scope :accepted, where("accepted_at is NOT NULL") scope :pending, where(accepted_at: nil) ... end
Scopes
Sunday, December 5, 2010All of my open-sourced projects share two attributes. First, the source code is extremely stylized and meant to be /read/ more than /used/. They are literary arguments in code much more than a useful piece of infrastructure. If you read the source-code to Arel you will see a highly afgected "combinator" and "interpreter" style of coding.
Nick Kallen
Sunday, December 5, 2010joins = [{:dim_locations=>[:dim_zip, {:dim_city=> {:dim_state=>:dim_country}}]}, :dim_ages, :dim_car_makes, :dim_educations, :dim_employments, :dim_foods, :dim_genders, :dim_get_aways, :dim_home_ownerships, :dim_incomes, :dim_marital_statuses, :dim_teams] conditions = ["(dim_zips.zip_code = ? OR dim_zips.zip_code IS NULL) AND (dim_cities.city = ? OR dim_cities.city IS NULL) AND (dim_states.state_code = ? OR dim_states.state_code IS NULL) AND (dim_states.state = ? OR dim_states.state IS NULL) AND (dim_countries.country_code = ? OR dim_countries.country_code IS NULL) AND (dim_countries.country = ? OR dim_countries.country IS NULL) AND (dim_ages.age = ? OR dim_ages.age IS NULL) AND (dim_car_makes.car_make IN (?) OR dim_car_makes.car_make IS NULL) AND (dim_educations.education = ? OR dim_educations.education IS NULL) AND (dim_employments.employment = ? OR dim_employments.employment IS NULL) AND (dim_foods.food IN (?) OR dim_foods.food IS NULL) AND (dim_genders.gender = ? OR dim_genders.gender IS NULL) AND (dim_get_aways.get_away IN (?) OR dim_get_aways.get_away IS NULL) AND (dim_home_ownerships.home_ownership = ? OR dim_home_ownerships.home_ownership IS NULL) AND (dim_incomes.income = ? OR dim_incomes.income IS NULL) AND (dim_marital_statuses.marital_status = ? OR dim_marital_statuses.marital_status IS NULL) AND (dim_teams.team IN (?) OR dim_teams.team IS NULL)", "98104", "Seattle", "WA", "Washington", "US", "United States of America", "18-34", ["Ashton Martin"], "Bachelors", "Full Time", ["Brazilian"], "Male", ["France"], "Rent", "Less than 30k", "Married", ["Arizona Cardinals", "Boston Bruins"]]
Benchmark.measure do Koupon.includes(joins).where(conditions).each end => 127.930000 0.390000 128.320000 (129.897278)
Sunday, December 5, 2010O(n^2) vs O(n)
Sunday, December 5, 2010ActionController::Routing::Routes.draw do |map| map.resources :schedules do |schedules| schedules.resource :timeslots end map.resources :sponsors, :member => {:enable => :post, :disable => :post} map.resources :talks map.root :controller => 'home', :action => 'index' end
BizConf::Application::Routes.draw do resources :schedules do resource :timeslots end resources :sponsors do post :enable, :disable end resources :talks root :to => 'home#index' end
config/routes.rb Rails 2.x
Sunday, December 5, 2010match "/api/v1/post/:id", :to => redirect("/api/article/%{id}")
Sunday, December 5, 2010AbstractController::Base ActionController::Metal ActionController::Base ApplicationController
Sunday, December 5, 2010require 'mongo' class GridfsController < ActionController::Metal def serve gridfs_path = env["PATH_INFO"].gsub("/images/", "") begin fs = Mongo::GridFileSystem.new(Mongoid.database) gridfs_file = fs.open(gridfs_path, 'r') self.response_body = gridfs_file.read self.content_type = gridfs_file.content_type rescue self.status = :file_not_found self.content_type = 'text/plain' self.response_body = '' end end end
http://socialmemorycomplex.net/2010/06/02/gridfs-with-mongoid-and-carrierwave-on-rails-3/ Sunday, December 5, 2010$ rails Usage: rails COMMAND [ARGS] The most common rails commands are: generate Generate new code (short-cut alias: "g") console Start the Rails console (short-cut alias: "c") server Start the Rails server (short-cut alias: "s") dbconsole Start a console for database in config/database.yml (short-cut alias: "db") new Create a new Rails application. "rails new my_app" creates a new application called MyApp in "./my_app" In addition to those, there are: application Generate the Rails application code destroy Undo code generated with "generate" benchmarker See how fast a piece of code runs profiler Get profile information from a piece of code plugin Install a plugin runner Run a piece of code in the application environment
Sunday, December 5, 2010The Rich Get Richer: RAILS 3
Upgrade Path?
Rails 3 Documentation Project
MAKE YOUR DONATION AT
THE RAILS
™ 3 WAYTHE RAILS
™ 3 WAYForewords by David Heinemeier Hansson, creator of Ruby on Rails and Yehuda Katz, Rails Core
OBIE FERNANDEZ
with DURRAN JORDAN, JON LARKOWSKI, XAVIER NORIA, and TIM POPE
A d d i s o n - W e s l e y P r o f e s s i o n a l R u b y S e r i e s FERNANDEZ ISBN-13: ISBN-10: 978-0-321-60166-7 0-321-60166-1 9 7 8 0 3 2 1 6 0 1 6 6 7 5 4 9 9 9 $49.99 U.S. | $59.99 CANADA Cover design by Chuti Prasertsith Cover photograph by Grant Faint/Getty Images Inc. ext printed on recycled paper P R O G RAMM IN G / RU B Y O N RA IL S The Bible for Ruby on Rails Application Development y on Rails strips complexity from the development process, enabling professional developers to focus on what matters most: delivering business value via clean and maintainable code. The Rails™ 3 Way is the only comprehensive, authoritative guide to delivering production-quality code with Rails 3. Pioneering Rails expert Obie Fernandez and a team of leading experts illuminate the entire Rails 3 API, along with the idioms, design approaches, and libraries that make developing applications with Rails so powerful. wing on their unsurpassed experience and track record, they address the real challenges development teams face, showing how to use Rails 3 to maximize your productivity. Using numerous detailed code examples, the author systematically covers Rails 3 key capabilities and subsystems, making this book a reference that you will turn to again and again. He presents advanced Rails programming techniques that have been proven effective in day-to-day usage on dozens of production Rails systems and offers important insights into behavior-driven development and production considerations such as scalability. Dive deep into the Rails 3 codebase and discover why Rails is designed the way it is—and how to make it do what you want it to do. This book will help youHASHROCKET
EXPERTLY CRAFTED WEBThank you
Obie Fernandez
Sunday, December 5, 2010