SlideShare a Scribd company logo
RUBY (AND RAILS)
Jan Berdajs	

@mrbrdo
RUBY
•

Japan	


•

Yukihiro Matsumoto a.k.a. Matz	


•

24. Feb. 1993	


•

Matz is nice and so we are nice
(MINASWAN)
RAILS
•

Denmark	


•

David Heinemeier Hansson a.k.a
DHH	


•

BaseCamp / 37 signals	


•

July 2004	


•

“The best frameworks are in my
opinion extracted, not envisioned.
And the best way to extract is first
to actually do.”
STUFF ON RAILS
ECOSYSTEM
RubyGems
PACKAGES
ASP.NET NuGet:	

PHP	

Pear:	

Packagist/Composer:	

Python PyPI:	

Node.JS NPM:	

Ruby RubyGems:

17,770	

!

595	

21,754	

38,607	

53,740	

68,500

!

Honorable mention:	

Java, Scala: Maven etc, too many to count
INTERACTIVE CONSOLE
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
(1..n_presledkov).each do!
putc " "!
end!
!
(1..n_zvezdic).each do!
putc "*"!
end!
!
putc "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
n_presledkov.times do!
print " "!
end!
!
n_zvezdic.times do!
print "*"!
end!
!
print "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
print " " * n_presledkov!
!
!
!
print "*" * n_zvezdic!
!
!
!
print "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
puts " " * n_presledkov + "*" * n_zvezdic!
!
!
!
!
!
!
!
!
end!
!
MANY WAYS TO DO IT
n = 15!
!
n.times do |i|!
n_zvezdic = i * 2 + 1!
n_presledkov = n - i - 1!
!
puts " " * n_presledkov + "*" * n_zvezdic!
end!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
(1..n_presledkov).each do!
putc " "!
end!
!
(1..n_zvezdic).each do!
putc "*"!
end!
!
putc "n"!
end!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
Java:!
class Test { public static void main(String args[]) {} }!
!
!
!
!
!
!
!
MANY WAYS TO DO IT
n = 15!
!
n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}!
!
!
!
!
!
!
!
!
!
JUST COOL
Date.today.thursday? # => true!
!
10.seconds.ago # => 2014-01-09 09:15:10 +0100!
!
10.even? # => true!
!
102.megabytes + 24.kilobytes + 10.bytes # => 106,979,338!
!
10 + 1 # => 11!
!
class Fixnum!
def +(i)!
42!
end!
end!
!
10 + 1 # => 42!
JUST COOL
def alive?!
state != :dead!
end!

!

def clear!!
everything.remove!
end!

!

def setting=(value)!
raise "invalid value" unless value == 42!
end!
obj.setting = 5!

!

def [](key)!
key + 1!
end!
obj[1] # => 2!

!

def []=(key, value)!
whatevz!
end!
obj[1] = 2!
BEST PRACTICES

Short methods, self-commenting code	

+ readability	

+ testing	

!

You only need comments when you know your code	

is written so bad that people won’t understand it.
def clients!
User.where(user_type: "client")!
end!

!

def days_until_next_week(date)!
8 - date.cwday!
end!

!

def next_week_start(after_date)!
after_date + days_until_next_week(after_date).days!
end!
def payments_next_week!
payments = []!

!

User.where(user_type: "client").each do |user|!
next_week_start = Date.today + (8 Date.today.cwday).days!
next_week_end = next_week_start + 7.days!
payments = user.payments.where("due_on >= ? AND
due_on < 1.week.from_now", next_week_start,
next_week_end)!
payments.each do |payment|!
next if payment.due_on.saturday? ||
payment.due_on.sunday?!
payments << payment!
end!
end!
end!

!

def week_end(week_start)!
week_start + 7.days!
end!

!

def client_payments_between(client, range)!
client.payments!
.where("due_on >= ?", range.first)!
.where("due_on < ?", range.last)!
end!

!

def client_payments_next_week(client)!
start_day = next_week_start(Date.today)!
client_payments_between(client,!
start_day..week_end(start_day))!
end!

!

def payment_on_weekend?(payment)!
payment.due_on.saturday? || payment.due_on.sunday?!
end!

!

def payments_next_week!
clients.flat_map do |client|!
client_payments_next_week(client).reject do |payment|!
payment_on_weekend?(payment)!
end!
end!
end!
BEST PRACTICES
Testing
!
!

!
!

describe "#decline!" do!
subject { create :booking }!
context "without reason" do!
before { subject.decline! }!
its(:status) { should == "declined" }!
its(:declined?) { should be_true }!
end!
context "with reason" do!
before { subject.decline!("REASON!") }!
its(:status) { should == "declined" }!
its(:declined?) { should be_true }!
its(:status_reason) { should == "REASON!" }!
end!
end!
BEST PRACTICES

TEST FIRST => great object interfaces/APIs
Write how you want to use it, before you implement it.
BEST PRACTICES
Don’t repeat yourself!
Extract duplicate logic
# user.rb!

!

# file1.rb!

!
User.where(user_type:
!
# file2.rb!
!

"client").first!

User.where(user_type: "client", active: false).first!

class User!
def self.client!
where(user_type: "client")!
end!
end!

!

# file1.rb!

!

User.client.first!

!

# file2.rb!

!

User.client.where(active: false).first!
BEST PRACTICES
Don’t repeat yourself!
Extract duplicate logic
# user.rb!

!

class User!
def self.client!
where(user_type: "client")!
end!
end!

# file1.rb!

!
User.where(user_type:
!
# file2.rb!
!

"client").first!

!

# file1.rb!

User.where(user_type: "client", active: false).first!

!

User.client.first!

!

# file2.rb!

2 places to fix

1 place to fix

!

User.client.where(active: false).first!

+ easier to test
BEST PRACTICES

Convention over configuration
Sensible defaults
MY STUFF
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
MY JOB STUFF @ D-LABS
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
QUESTIONS

More Related Content

PPT
Launch of Vayu Vajra on Bannerghatta Road
PDF
MongoDB, Development and You
DOCX
وقفة دعوية من السنة النبوية
TXT
Socket related concepts
PDF
Mobisreve Bangladesh
DOCX
gladis 3
TXT
Neu textdokument
DOCX
Test telephoning script part 1
Launch of Vayu Vajra on Bannerghatta Road
MongoDB, Development and You
وقفة دعوية من السنة النبوية
Socket related concepts
Mobisreve Bangladesh
gladis 3
Neu textdokument
Test telephoning script part 1

Similar to Why use Ruby and Rails? (20)

PDF
Esoteric, Obfuscated, Artistic Programming in Ruby
PDF
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
PDF
Python Performance Profiling: The Guts And The Glory
PPTX
Hadoop Streaming Tutorial With Python
KEY
An introduction to Ruby
ODP
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
PDF
Nobody asks "How is JavaScript?"
PDF
An Introduction to Go
PDF
Front End Dependency Management at CascadiaJS
PDF
Fluent Refactoring (Lone Star Ruby Conf 2013)
PDF
Impossible Programs
PDF
Blocks by Lachs Cox
PDF
Migrating To Ruby1.9
PDF
An Event Apart Boston: Principles of Unobtrusive JavaScript
PDF
Ruby - Uma Introdução
PDF
Class 12 CBSE Computer Science Investigatory Project
PDF
Automate Yo' Self
PDF
Tour of language landscape (katsconf)
KEY
Test First Teaching
PPT
go.ppt
Esoteric, Obfuscated, Artistic Programming in Ruby
Pilot Tech Talk #9 — Ember.js: Productivity without the fatigue by Jacek Gala...
Python Performance Profiling: The Guts And The Glory
Hadoop Streaming Tutorial With Python
An introduction to Ruby
Ruby on Rails - Pengenalan kepada “permata” dalam pengaturcaraan
Nobody asks "How is JavaScript?"
An Introduction to Go
Front End Dependency Management at CascadiaJS
Fluent Refactoring (Lone Star Ruby Conf 2013)
Impossible Programs
Blocks by Lachs Cox
Migrating To Ruby1.9
An Event Apart Boston: Principles of Unobtrusive JavaScript
Ruby - Uma Introdução
Class 12 CBSE Computer Science Investigatory Project
Automate Yo' Self
Tour of language landscape (katsconf)
Test First Teaching
go.ppt
Ad

Recently uploaded (20)

PDF
Machine learning based COVID-19 study performance prediction
PPT
Teaching material agriculture food technology
PPT
“AI and Expert System Decision Support & Business Intelligence Systems”
PDF
Empathic Computing: Creating Shared Understanding
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Electronic commerce courselecture one. Pdf
PPTX
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
PPTX
Spectroscopy.pptx food analysis technology
PPTX
sap open course for s4hana steps from ECC to s4
PPTX
Machine Learning_overview_presentation.pptx
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
Network Security Unit 5.pdf for BCA BBA.
PDF
Spectral efficient network and resource selection model in 5G networks
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PDF
Chapter 3 Spatial Domain Image Processing.pdf
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PDF
Review of recent advances in non-invasive hemoglobin estimation
PDF
Encapsulation_ Review paper, used for researhc scholars
Machine learning based COVID-19 study performance prediction
Teaching material agriculture food technology
“AI and Expert System Decision Support & Business Intelligence Systems”
Empathic Computing: Creating Shared Understanding
NewMind AI Weekly Chronicles - August'25-Week II
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Electronic commerce courselecture one. Pdf
VMware vSphere Foundation How to Sell Presentation-Ver1.4-2-14-2024.pptx
Spectroscopy.pptx food analysis technology
sap open course for s4hana steps from ECC to s4
Machine Learning_overview_presentation.pptx
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
Network Security Unit 5.pdf for BCA BBA.
Spectral efficient network and resource selection model in 5G networks
Programs and apps: productivity, graphics, security and other tools
Assigned Numbers - 2025 - Bluetooth® Document
Chapter 3 Spatial Domain Image Processing.pdf
Advanced methodologies resolving dimensionality complications for autism neur...
Review of recent advances in non-invasive hemoglobin estimation
Encapsulation_ Review paper, used for researhc scholars
Ad

Why use Ruby and Rails?

  • 1. RUBY (AND RAILS) Jan Berdajs @mrbrdo
  • 2. RUBY • Japan • Yukihiro Matsumoto a.k.a. Matz • 24. Feb. 1993 • Matz is nice and so we are nice (MINASWAN)
  • 3. RAILS • Denmark • David Heinemeier Hansson a.k.a DHH • BaseCamp / 37 signals • July 2004 • “The best frameworks are in my opinion extracted, not envisioned. And the best way to extract is first to actually do.”
  • 6. PACKAGES ASP.NET NuGet: PHP Pear: Packagist/Composer: Python PyPI: Node.JS NPM: Ruby RubyGems: 17,770 ! 595 21,754 38,607 53,740 68,500 ! Honorable mention: Java, Scala: Maven etc, too many to count
  • 8. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! (1..n_presledkov).each do! putc " "! end! ! (1..n_zvezdic).each do! putc "*"! end! ! putc "n"! end! !
  • 9. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! n_presledkov.times do! print " "! end! ! n_zvezdic.times do! print "*"! end! ! print "n"! end! !
  • 10. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! print " " * n_presledkov! ! ! ! print "*" * n_zvezdic! ! ! ! print "n"! end! !
  • 11. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! puts " " * n_presledkov + "*" * n_zvezdic! ! ! ! ! ! ! ! ! end! !
  • 12. MANY WAYS TO DO IT n = 15! ! n.times do |i|! n_zvezdic = i * 2 + 1! n_presledkov = n - i - 1! ! puts " " * n_presledkov + "*" * n_zvezdic! end! ! ! ! ! ! ! ! ! !
  • 13. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 14. MANY WAYS TO DO IT n = 15! ! (1..n).each do |i|! n_zvezdic = (i - 1) * 2 + 1! n_presledkov = n - i! ! (1..n_presledkov).each do! putc " "! end! ! (1..n_zvezdic).each do! putc "*"! end! ! putc "n"! end! !
  • 15. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 16. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! Java:! class Test { public static void main(String args[]) {} }! ! ! ! ! ! ! !
  • 17. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  • 18. JUST COOL Date.today.thursday? # => true! ! 10.seconds.ago # => 2014-01-09 09:15:10 +0100! ! 10.even? # => true! ! 102.megabytes + 24.kilobytes + 10.bytes # => 106,979,338! ! 10 + 1 # => 11! ! class Fixnum! def +(i)! 42! end! end! ! 10 + 1 # => 42!
  • 19. JUST COOL def alive?! state != :dead! end! ! def clear!! everything.remove! end! ! def setting=(value)! raise "invalid value" unless value == 42! end! obj.setting = 5! ! def [](key)! key + 1! end! obj[1] # => 2! ! def []=(key, value)! whatevz! end! obj[1] = 2!
  • 20. BEST PRACTICES Short methods, self-commenting code + readability + testing ! You only need comments when you know your code is written so bad that people won’t understand it.
  • 21. def clients! User.where(user_type: "client")! end! ! def days_until_next_week(date)! 8 - date.cwday! end! ! def next_week_start(after_date)! after_date + days_until_next_week(after_date).days! end! def payments_next_week! payments = []! ! User.where(user_type: "client").each do |user|! next_week_start = Date.today + (8 Date.today.cwday).days! next_week_end = next_week_start + 7.days! payments = user.payments.where("due_on >= ? AND due_on < 1.week.from_now", next_week_start, next_week_end)! payments.each do |payment|! next if payment.due_on.saturday? || payment.due_on.sunday?! payments << payment! end! end! end! ! def week_end(week_start)! week_start + 7.days! end! ! def client_payments_between(client, range)! client.payments! .where("due_on >= ?", range.first)! .where("due_on < ?", range.last)! end! ! def client_payments_next_week(client)! start_day = next_week_start(Date.today)! client_payments_between(client,! start_day..week_end(start_day))! end! ! def payment_on_weekend?(payment)! payment.due_on.saturday? || payment.due_on.sunday?! end! ! def payments_next_week! clients.flat_map do |client|! client_payments_next_week(client).reject do |payment|! payment_on_weekend?(payment)! end! end! end!
  • 22. BEST PRACTICES Testing ! ! ! ! describe "#decline!" do! subject { create :booking }! context "without reason" do! before { subject.decline! }! its(:status) { should == "declined" }! its(:declined?) { should be_true }! end! context "with reason" do! before { subject.decline!("REASON!") }! its(:status) { should == "declined" }! its(:declined?) { should be_true }! its(:status_reason) { should == "REASON!" }! end! end!
  • 23. BEST PRACTICES TEST FIRST => great object interfaces/APIs Write how you want to use it, before you implement it.
  • 24. BEST PRACTICES Don’t repeat yourself! Extract duplicate logic # user.rb! ! # file1.rb! ! User.where(user_type: ! # file2.rb! ! "client").first! User.where(user_type: "client", active: false).first! class User! def self.client! where(user_type: "client")! end! end! ! # file1.rb! ! User.client.first! ! # file2.rb! ! User.client.where(active: false).first!
  • 25. BEST PRACTICES Don’t repeat yourself! Extract duplicate logic # user.rb! ! class User! def self.client! where(user_type: "client")! end! end! # file1.rb! ! User.where(user_type: ! # file2.rb! ! "client").first! ! # file1.rb! User.where(user_type: "client", active: false).first! ! User.client.first! ! # file2.rb! 2 places to fix 1 place to fix ! User.client.where(active: false).first! + easier to test
  • 26. BEST PRACTICES Convention over configuration Sensible defaults
  • 32. MY JOB STUFF @ D-LABS