When To Use Ruby On Rails

31
When to use Ruby on Rails? Sytse Sijbrandij [email protected]

description

To advantages and disadvantages of the Ruby programming language and the Rails framework. Includes advise when to use it and comparisons to PHP.

Transcript of When To Use Ruby On Rails

Page 1: When To Use Ruby On Rails

When to use Ruby on Rails?

Sytse Sijbrandij

[email protected]

Page 2: When To Use Ruby On Rails

Contents• Ruby

– What is it?– Advantages– Disadvantages

• Rails– What is it?– Advantages– Disadvantages

• When to use it• Reusable best practices

Ruby Beach, Washington, U.S.Kevin Mc Neal

Page 3: When To Use Ruby On Rails

What is Ruby?

• A scripting language more powerful than

Perl and more object-oriented than Python.

• Invented in 1993 with inspiration from Perl, Phyton, Smalltalk, Eiffel, Ada, and Lisp.

• Designed for programmer productivity and joy instead of machine efficiency.

• Follows the principle of least surprise, the language should minimize confusion.

• It's easy to work with and to love Ruby.Yukihiro 'Matz' Matsumoto

Ruby's Architect

Page 4: When To Use Ruby On Rails

Ruby Advantages

• Elegant

• Powerful

• Readable

• Concise

Ruby and Diamond ringR. M. Rayner

Page 5: When To Use Ruby On Rails

class NewBowlingGame extends PHPSpec_Context{

private $_bowling = null;public function before(){

$this->_bowling = new Bowling;}

public function itShouldScore0ForGutterGame(){

for ($i=1; $i<=20; $i++) {$this->_bowling->hit(0);

} $this->spec($this->_bowling->score)->should->equal(0);}

}

describe Bowling dobefore(:each) do@bowling = Bowling.new

end

it "should score 0 for gutter game" do20.times { @bowling.hit(0) }@bowling.score.should == 0

endend

Ruby is Elegant

Page 6: When To Use Ruby On Rails

Ruby is Powerful

• Object-oriented (everything is an object)

• Dynamic (duck typing)

# Open Ruby's Time class and add a methodclass Timedef yesterdayself - 86400

endend

today = Time.now # => Thu Aug 14 16:51:50 +1200 2008yesterday = today.yesterday # => Wed Aug 13 16:51:50 +1200 2008

Page 7: When To Use Ruby On Rails

Ruby is Readable

• The code comments itself

• Leads to better naming practices

# An example example function for a photo camera programdef shutter_clickedcapture_image if @camera.on? and @camera.memory_available?

end

Page 8: When To Use Ruby On Rails

Ruby is Concise

• Very expressive language

• Less lines of code, higher productivity

-199.abs # 199"ruby is cool".length # 12"Your Mom".index("u") # 2"Nice Day!".downcase.split(//).sort.uniq.join # " !acdeiny"

say = "I love Ruby"say['love'] = "*love*"5.times { puts say }=> "I *love* Ruby" "I *love* Ruby" "I *love* Ruby" "I *love* Ruby" "I *love* Ruby"

Page 9: When To Use Ruby On Rails

Ruby Disadvantages

• Ruby is Slow

• Ruby is New

Ruby Fails Falls, Lookout Mountain, U.S.Oscar & L

Page 10: When To Use Ruby On Rails

Ruby is Slow

• About 10x slower than Java, 2x slower than PHP

All benchmarks, x64 Ubuntu, Intel Q6600 QuadComputer Language Benchmarks Game

Page 11: When To Use Ruby On Rails

Ruby is New

• Not many developers or customers

• No common IDE

– Most coders use the Mac text-editor Textmate

– IDEs: RadRails, RubyMine, 3rd Rail, Netbeans

• No common application server

– Passenger's Apache module has momentum

Page 12: When To Use Ruby On Rails

Evolution to web frameworks

Static Dynamic Integrated

From 1990 to 2009Time

Type of site

Tools

Business roleMarketing

• Brochure

• Advertising

Front office

• Communication

• Ordering

• Mailings

Back office

• Quotations

• Fulfillment

• Legacy systems

HTML editors:

Frontpage

Dreamweaver

PHP + MySQL:

Joomla

Drupal

Wordpress

Typo3

.Net

Sharepoint

Frameworks:

CakePHP (PHP)

Grails (Groovy)

Django (Phyton)

Ruby on Rails (Ruby)

Merb (Ruby)

Sanatra (Ruby)

Page 13: When To Use Ruby On Rails

What is ?

• Web application framework• Open Source (MIT license)• Based on a existing

application (Basecamp)• Provides common needs:

– Routing, sessions– Database storage– Business logic– Generate HTML/XML/CSS/Ajax– Testing

Creator of Ruby on RailsDavid Heinemeier Hansson

Page 14: When To Use Ruby On Rails

Who uses Rails

• Internally:

• Externally:

• style.mtv.com

• www.getsatisfaction.com

• www.basecamp.com

• www.yellowpages.com

• www.twitter.com

• www.yelloyello.nl

Page 15: When To Use Ruby On Rails

Rails Advantages

• Convention over configuration

• Don’t Repeat Yourself

• Object Relational Mapping

• Model View Controller

• Reuse of code

• Agile practices

• Security

Tay Rail Bridge, ScotlandRoss2085

Page 16: When To Use Ruby On Rails

Convention over Configuration

• Table and foreign key naming– Tables are multiples

(users, orders, etc.)

– Foreign key naming: user_id

• Default locations– MVC, Tests, Languages, Plugins

• Naming– Class names: CamelCase

– Files: lowercase_underscored.rb

Page 17: When To Use Ruby On Rails

Don’t repeat yourself

• Everything is defined in a single, unambiguous place

• Easier to find code– Only need to look once

– Can stop looking when found

– Well defined places for most items

• Much easier to maintain code– Faster to change

– Less inconsistency bugs

Page 18: When To Use Ruby On Rails

Model View Controller

• Model– Object relationships

(users, orders)

• Controller– Business logic

(perform a payment)

• View– Visual representation

(generate HTML/XML)

Page 19: When To Use Ruby On Rails

Model

• Contains validation and object methods

• Use 'fat' models and 'skinny' controllers to increase reuse of methods across controllers

class Order < ActiveRecord::Basehas_many :line_itemshas_one :userhas_one :email, :through => :user

validates_presence_of :uservalidates_numericality_of :amount

def purchaseself.purchase_time = Now

endend

Page 20: When To Use Ruby On Rails

View

• DSL languages

• Erb for ruby & html

• Haml improves on erb

• Textile for html

• Sass for css<div id='content'><div class='left column'><h2>Welcome to our site!</h2><p>

<%= print_information %></p>

</div><div class="right column"><%= render "sidebar" %>

</div></div>

#content.left.column%h2 Welcome to our site!%p= print_information

.right.column= render "sidebar"

Page 21: When To Use Ruby On Rails

Controller

• RESTful

– Better than SOAP

– Easy to understand

– Easy to debug

– Easy to cache

– Easy to prioritize

– No bottleneck

– HTML/XML/JSON

Method Resource Verb index /people GET show /people/12 GET create /people POST update /people/12 PUT delete /people/12 DELETE

GET /people/12.xml

def show@person =

Person.find(params[:id])respond_to do |wants|

wants.htmlwants.xml { render :xml

=> @person.to_xml }end

end

Page 22: When To Use Ruby On Rails

Object Relational Mapping

# Examples of finding recordsUser.find(:all)User.find(23).articlesUser.find_by_first_name('Johnny')User.order.find(:last).lines_items.count

Programming object Database row

#<User id: 1, login: "Sytse", email: "[email protected]", description: "<p>Sytse studied Management Science at the Universi...", avatar_id: 1, crypted_password: "b6675cab85b541a91e6d0

ORM Tools:-ActiveRecord-DataMapper-iBATIS

find

save

Page 23: When To Use Ruby On Rails

Re-use of code

• Gems and plugins, more then 1300

– For authentication, pagination, testing, etc.

• Git allows easy forking and merging

• Github website allows you to give back

• Acts as a portfolio

Page 24: When To Use Ruby On Rails

Agile practices

• Iterations (branch often, merge often)

• Test all the time (TDD, BDD)

Stories > Tests > Code > Continuous Integration

Story exampleFeature: Log-inIn order to view my profileAs a Registered memberI want to be required to log-in

Test exampleGiven /I am the registered member "quire"/ do@user = User.new({ :login => 'quire})@user.save!

end

Page 25: When To Use Ruby On Rails

Security

• Rails prevents SQL injection attacks– Attacher post in form: "some_title; DROP TABLE articles;"

– In bad code this can be injected:

"SELECT * FROM ARTICLES WHERE TITLE = $TITLE"

– Rails will be escape the input automatically:

@articles = Article.find(:all,

:conditions => [:title => params[:title]])

• Rails prevents Cross Site Scripting (XSS)– With html_escape in view: <%=h comment.body %>

Page 26: When To Use Ruby On Rails

Rails Disadvantages

• Rails is inefficient

• Rails is hard to deploy

Montparnesse 1895Jeff Mc Neill

Page 27: When To Use Ruby On Rails

Rails is inefficient

• Rails uses a lot of memory,

up to 150MB per instance

• Requires more application servers

• Where are your development constrains?

Resource Example application Rails

Man hours 2.200 hours / e22.000 1.000 hours / e10.000

Project duration 15 weeks of changes / e3.000 10 weeks / e2.000

Computing power 2 servers / e2.000 5 servers / e5.000

Total e27.000 e17.000

Page 28: When To Use Ruby On Rails

Rails is hard to deploy

• Harder than PHP, better with Passenger

• Lots of moving parts

– Rails, apps, gems, plugins

– Application server, webserver

• Deployment via scripts

– Via the Capistrano tool

– Easy to break something

• Deployment to multiple servers

Page 29: When To Use Ruby On Rails

When to use Ruby on Rails?

• New code base and DB

• High development speed

• Complex applications

• Web deployment

• Iterative projects

• Development is expensive

• Fixed price project

• Early adopter client/team

• Existing code and DB

• Low development speed

• Simple applications

• Client deployment

• Waterfall projects

• Deployment is expensive

• Hourly rate project

• Late majority client/team

Page 30: When To Use Ruby On Rails

Re-usable best practices

• Don't Repeat Yourself• 'Fat' model, 'skinny' controller• MVC framework

– CakePHP

• Integration testing– Selenium

• DSL's– Textile for markup

• Source code repository– GIT

• Project management– Github, Lighthouse, Basecamp

Recycle shirt by Brian Damage

Page 31: When To Use Ruby On Rails

Questions?

http://www.dosire.com/