Slide 1

Slide 1 text

The Problem is Your Ruby Thursday, September 22, 11

Slide 2

Slide 2 text

The Problem is Your Ruby Jeff Casimir / @j3 Thursday, September 22, 11

Slide 3

Slide 3 text

Thursday, September 22, 11

Slide 4

Slide 4 text

Rails “Expertise” Thursday, September 22, 11

Slide 5

Slide 5 text

Rails is Not a Language Thursday, September 22, 11

Slide 6

Slide 6 text

Thursday, September 22, 11

Slide 7

Slide 7 text

Ruby Thursday, September 22, 11

Slide 8

Slide 8 text

HTML CSS JavaScript Database Design Ruby OO Design UI/UX Testing DevOps Thursday, September 22, 11

Slide 9

Slide 9 text

Real Skills Thursday, September 22, 11

Slide 10

Slide 10 text

Thursday, September 22, 11

Slide 11

Slide 11 text

OO Design Thursday, September 22, 11

Slide 12

Slide 12 text

Thursday, September 22, 11

Slide 13

Slide 13 text

Thursday, September 22, 11

Slide 14

Slide 14 text

Thursday, September 22, 11

Slide 15

Slide 15 text

Thursday, September 22, 11

Slide 16

Slide 16 text

How I Got Here Thursday, September 22, 11

Slide 17

Slide 17 text

Thursday, September 22, 11

Slide 18

Slide 18 text

Thursday, September 22, 11

Slide 19

Slide 19 text

Thursday, September 22, 11

Slide 20

Slide 20 text

Thursday, September 22, 11

Slide 21

Slide 21 text

Database Design Ruby Thursday, September 22, 11

Slide 22

Slide 22 text

Thursday, September 22, 11

Slide 23

Slide 23 text

Thursday, September 22, 11

Slide 24

Slide 24 text

Thursday, September 22, 11

Slide 25

Slide 25 text

Database Design OO Design Ruby Thursday, September 22, 11

Slide 26

Slide 26 text

Collections Thursday, September 22, 11

Slide 27

Slide 27 text

Thursday, September 22, 11

Slide 28

Slide 28 text

Thursday, September 22, 11

Slide 29

Slide 29 text

Thursday, September 22, 11

Slide 30

Slide 30 text

greens reds Thursday, September 22, 11

Slide 31

Slide 31 text

greens reds Thursday, September 22, 11

Slide 32

Slide 32 text

greens, reds = candy.partition{|m| m.green?} greens reds Thursday, September 22, 11

Slide 33

Slide 33 text

Just One Idea Thursday, September 22, 11

Slide 34

Slide 34 text

Thursday, September 22, 11

Slide 35

Slide 35 text

Application Thursday, September 22, 11

Slide 36

Slide 36 text

Application Module Thursday, September 22, 11

Slide 37

Slide 37 text

Application Class Module Thursday, September 22, 11

Slide 38

Slide 38 text

Application Class Module Method Thursday, September 22, 11

Slide 39

Slide 39 text

Application Class Module Method Line Thursday, September 22, 11

Slide 40

Slide 40 text

Application Class Module Method Line Thursday, September 22, 11

Slide 41

Slide 41 text

U g Person Business Thursday, September 22, 11

Slide 42

Slide 42 text

U g Person Business M Email q Phone First Name Last Name Name Thursday, September 22, 11

Slide 43

Slide 43 text

Contact Thursday, September 22, 11

Slide 44

Slide 44 text

g Business U Person Contact Thursday, September 22, 11

Slide 45

Slide 45 text

class Contact < ActiveRecord::Base has_many :phone_numbers has_many :email_addresses end class Person < Contact def name [last_name, first_name].join ", " end end class Company < Contact end Thursday, September 22, 11

Slide 46

Slide 46 text

Reuse via Module Thursday, September 22, 11

Slide 47

Slide 47 text

class Person < ActiveRecord::Base include Contact def name [last_name, first_name].join ", " end end class Company < ActiveRecord::Base include Contact end Thursday, September 22, 11

Slide 48

Slide 48 text

module Contact def self.included(source) do source.send(:has_many, :phone_numbers) source.send(:has_many, :email_addresses) end end /app/models/contact.rb Thursday, September 22, 11

Slide 49

Slide 49 text

module Contact def self.included(source) do source.send(:has_many, :phone_numbers) source.send(:has_many, :email_addresses) end end /app/models/contact.rb Send the message :has_many with parameter :phone_numbers to source Thursday, September 22, 11

Slide 50

Slide 50 text

Utility Objects Thursday, September 22, 11

Slide 51

Slide 51 text

class Article < ActiveRecord::Base before_validation :sanitize_text def sanitize_text self.body.gsub!("Ilias", "Trolololol") end end class Comment < ActiveRecord::Base before_validation :sanitize_text def sanitize_text self.body.gsub!("Ilias", "Trolololol") end end Thursday, September 22, 11

Slide 52

Slide 52 text

module TextDecorator module InstanceMethods def sanitize_text(input) input.gsub!("Ilias", "Trolololol") end end def self.included(source) source.send(:include, InstanceMethods) end end class Article < ActiveRecord::Base include TextDecorator before_validation :sanitize_text end Thursday, September 22, 11

Slide 53

Slide 53 text

module TextDecorator def self.sanitize_text(input) input.gsub!("Ilias", "Trolololol") end end /app/lib/text_decorator.rb class Article < ActiveRecord::Base before_validation { TextDecorator.sanitize_text(body) } end class Comment < ActiveRecord::Base before_validation { TextDecorator.sanitize_text(body) } end Thursday, September 22, 11

Slide 54

Slide 54 text

Clear over Clever Thursday, September 22, 11

Slide 55

Slide 55 text

Refactoring Thursday, September 22, 11

Slide 56

Slide 56 text

Thursday, September 22, 11

Slide 57

Slide 57 text

Thursday, September 22, 11

Slide 58

Slide 58 text

Thursday, September 22, 11

Slide 59

Slide 59 text

Scopes Thursday, September 22, 11

Slide 60

Slide 60 text

## Rails 2 Way class Article < ActiveRecord::Base named_scope :published, {:conditions => [:published => true]} named_scope :recent, {:limit => 5, :order => "published_at DESC"} end # Usage: Article.published.recent Thursday, September 22, 11

Slide 61

Slide 61 text

## Rails 3 Way class Article < ActiveRecord::Base scope :published, where(:published => true) scope :recent, limit(5).order("published_at DESC") end Thursday, September 22, 11

Slide 62

Slide 62 text

## Rails 3 Way class Article < ActiveRecord::Base scope :published, where(:published => true) scope :recent, limit(5).order("published_at DESC") end ## Rails 3 using Class Methods class Article < ActiveRecord::Base def self.published where(:published => true) end def self.recent limit(5).order("published_at DESC") end end Thursday, September 22, 11

Slide 63

Slide 63 text

class Article < ActiveRecord::Base scope :published, where(:published => true) scope :recent, lambda{|max| limit(max).order("published_at DESC")} end Thursday, September 22, 11

Slide 64

Slide 64 text

class Article < ActiveRecord::Base scope :published, where(:published => true) scope :recent, lambda{|max| limit(max).order("published_at DESC")} end class Article < ActiveRecord::Base def self.published where(:published => true) end def self.recent(max) limit(max).order("published_at DESC") end end Thursday, September 22, 11

Slide 65

Slide 65 text

AS::Concern Thursday, September 22, 11

Slide 66

Slide 66 text

module Contact module InstanceMethods def photo_filename name.parameterize + ".jpg" end end def self.included(source) do source.send(:has_many, :phone_numbers) source.send(:has_many, :email_addresses) source.send(:include, InstanceMethods) end end Normal Ruby Module Thursday, September 22, 11

Slide 67

Slide 67 text

module Contact extend ActiveSupport::Concern module InstanceMethods def photo_filename name.parameterize + ".jpg" end end included do has_many :phone_numbers has_many :email_addresses end end Using ActiveSupport::Concern Thursday, September 22, 11

Slide 68

Slide 68 text

def self.included(source) do source.send(:has_many, :phone_numbers) source.send(:has_many, :email_addresses) source.send(:include, InstanceMethods) end Send the message :include with parameter InstanceMethods to source Thursday, September 22, 11

Slide 69

Slide 69 text

module Contact module InstanceMethods def photo_filename name.parameterize + ".jpg" end end def self.included(source) do source.send(:has_many, :phone_numbers) source.send(:has_many, :email_addresses) source.send(:include, InstanceMethods) end end Normal Ruby Module Thursday, September 22, 11

Slide 70

Slide 70 text

Clarity Wins Thursday, September 22, 11

Slide 71

Slide 71 text

The Problem is Your Ruby Thursday, September 22, 11

Slide 72

Slide 72 text

The Problem is Your Ruby Rails “expertise” is pointless Focus on Ruby, OO, design Master collections & Enumerable Wrap and reuse code with Modules Favor clarity over brevity Jeff Casimir / @j3 Thursday, September 22, 11