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 fram...
STUFF ON RAILS
ECOSYSTEM
RubyGems
PACKAGES
ASP.NET NuGet:	

PHP	

Pear:	

Packagist/Composer:	

Python PyPI:	

Node.JS NPM:	

Ruby RubyGems:

17,770	

!

59...
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).ea...
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 d...
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
print " " * n_presle...
MANY WAYS TO DO IT
n = 15!
!
(1..n).each do |i|!
n_zvezdic = (i - 1) * 2 + 1!
n_presledkov = n - i!
!
puts " " * n_presled...
MANY WAYS TO DO IT
n = 15!
!
n.times do |i|!
n_zvezdic = i * 2 + 1!
n_presledkov = n - i - 1!
!
puts " " * n_presledkov + ...
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).ea...
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(St...
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.meg...
JUST COOL
def alive?!
state != :dead!
end!

!

def clear!!
everything.remove!
end!

!

def setting=(value)!
raise "invalid...
BEST PRACTICES

Short methods, self-commenting code	

+ readability	

+ testing	

!

You only need comments when you know ...
def clients!
User.where(user_type: "client")!
end!

!

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

!

def next_w...
BEST PRACTICES
Testing
!
!

!
!

describe "#decline!" do!
subject { create :booking }!
context "without reason" do!
before...
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:
!
# file...
BEST PRACTICES
Don’t repeat yourself!
Extract duplicate logic
# user.rb!

!

class User!
def self.client!
where(user_type:...
BEST PRACTICES

Convention over configuration
Sensible defaults
MY STUFF
MY JOB STUFF @ D-LABS
QUESTIONS
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Why use Ruby and Rails?
Upcoming SlideShare
Loading in...5
×

Why use Ruby and Rails?

176

Published on

Why would you use Ruby or Ruby on Rails, and why they are cool and fun.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
176
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
9
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Why use Ruby and Rails?

  1. 1. RUBY (AND RAILS) Jan Berdajs @mrbrdo
  2. 2. RUBY • Japan • Yukihiro Matsumoto a.k.a. Matz • 24. Feb. 1993 • Matz is nice and so we are nice (MINASWAN)
  3. 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.”
  4. 4. STUFF ON RAILS
  5. 5. ECOSYSTEM RubyGems
  6. 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
  7. 7. INTERACTIVE CONSOLE
  8. 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. 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. 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. 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. 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. 13. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  14. 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. 15. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  16. 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. 17. MANY WAYS TO DO IT n = 15! ! n.times{|i| puts " "*(n-i-1) + "*"*(i*2+1)}! ! ! ! ! ! ! ! ! !
  18. 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. 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. 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. 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. 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. 23. BEST PRACTICES TEST FIRST => great object interfaces/APIs Write how you want to use it, before you implement it.
  24. 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. 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. 26. BEST PRACTICES Convention over configuration Sensible defaults
  27. 27. MY STUFF
  28. 28. MY JOB STUFF @ D-LABS
  29. 29. QUESTIONS
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×