Ruby on Rails

Ruby on Rails
What's Ruby
A programming language
Developed by Yukihiro Matsumoto (aka
Matz) in the 1990s
What's Rails
Initially developed by David Heinemeier
Hansson, out of his work on Basecamp, a
project management system
It is a framework of scripts in ruby that
provide for rapid development of web
applications, esp those with a database back
end
Rails can build the skeleton of an application,
including the database tables, in just a few
commands
Ruby
Syntax
Ruby is largely and loosely based on
perl (hence the name, according to
lore)
Completely object oriented
Some Important differences
Unlike PHP, scope in variables is defined
by the leading sigil
the $ sign denotes global scope, not a
variable
an @ represents local scope within an
object instance
@@ represents local scope within a class
A capitalized name is a constant
Historical Differences
Javascript--born of the competition between
two companies
PHP--created by a varied community
Ruby--the vision of a single person
Rails--the vision of another single person
When you compare these, you can see how
the starting point influences the process of
development
Playing on the Command Line
Ruby is an interpreter, just like php or bash:
Avatar:~ hays$ ruby
print "howdy world!"
^d
Or, use ruby -e "command":
ruby -e 'puts "hello\n"'
Or, you can just use irb, which is easier:
Avatar:~ hays$ irb
>> print "howdy world!"
howdy world!=> nil
>>
Object Oriented
Truly
Not a prototyping language like
javascript
Nor a procedural language with OOP
bolted on
Classes
A class is a kind of master object
Can contain constants and methods
Instances of object can be created from
a class, inheriting the traits of the class
A simple class
class Cat
end
(but this class doesn't do or mean
anything)
the class examples are derived from
http://www.juixe.com/techknow/index.php/2007/01/22/ruby-class-tutorial/
cat class
I want four attributes for a cat; name,
color, type, and attribute
class Cat # must be capitalized
attr_accessor :name, :type, :color, :attribute
def initialize(name, type, color, attribute)
@name = name
@type = type
@color = color
@attribute = attribute
end
creating a new cat
Now, I can create an instance of the cat
class:
gc = Cat.new("GC", "short hair",
"black", "gimpy")
lc = Cat.new("LC", "short hair",
"black", "little")
add a method
I'd like to be able to describe my cats
easily
So I add a method to the cat class:
def describe
@name + " is a " + @color + " "
+ @type + " who is "
+ @attribute + ".\n"
end
eliminating con-cat-ination
The concatenation is a bit awkward
Like php, ruby has a structure for
calling variables within a string:
"#{@name} is a #{@color} #{@type}
who is #{@attribute}.\n"
calling the method
If I call a cat with the describe method
attached, I can get the description of
that cat:
my_string= gc.describe
puts my_string
or:
puts gc.describe
finding cats by name
A second method, find_by_name:
def self.find_by_name(name)
found = nil
ObjectSpace.each_object(Cat) { |o|
found = o if o.name == name
}
found
end
Access Control
Methods in a class are public by default
Private methods are known only to the
individual object
Protected methods can only be called
by members of the class in which is was
defined
Variables
In ruby, vars are references to objects, not
objects themselves
So:
a = "my value"
b=a
a[0] = "n"
will change both a and b--but if you reassign
a, eg a="new value", a is linked to a new
object (this might bite you, but it's not likely)
Arrays
Create an array by assignment:
my_array = [ "one", "two", 3, 4 ]
Referencing the array:
puts "my_array[0] is:
#{my_array[0]}\n"
The brackets are methods of the array
class…
Hashes
What in php is called an associative array is called
a hash in ruby
Creating a hash by assignment:
my_hash = { 'tree' => 'pine', 'bird' => 'mocking'}
puts "\n"
puts "my_hash['tree'] is: #{my_hash['tree']}\n"
puts "my_hash['bird'] is: #{my_hash['bird']}\n"
Notice that the syntax is different
walking a hash or array
use the each method:
a=1
my_hash.each do |key, value|
puts "#{a} #{key} is: #{value}"
a = a +1
end
conditional
much like php and javascript, but
simpler syntax:
a=1
my_hash.each do |key, value|
if key == "tree"
puts "#{a} #{key} is: #{value}"
end
a = a +1
end
In summary
Ruby's syntax is pretty
Ruby is all about structure
Classes are easy to work with, if you're
new, start with simple examples
Rails
Model View Controller (MVC)
Layering again
MVC allows a project team to work on
different aspects of the application without
stepping on each other's toes quite so often
Note that neither PHP nor Javascript
encourage this, but it can be done in PHP
(not so much in Javascript)
Rails enforces MVC
Model
Contains the data of the application
Transient
Stored (eg Database)
Enforces "business" rules of the
application
Attributes
Work flow
Views
Provides the user interface
Dynamic content rendered through
templates
Three major types
Ruby code in erb (embedded ruby)
templates
xml.builder templates
rjs templates (for javascript, and thus ajax)
Controllers
Perform the bulk of the heavy lifting
Handles web requests
Maintains session state
Performs caching
Manages helper modules
Convention over Configuration
Notion that coding is reduced if we adopt a
standard way of doing things
Eg., if we have a class "Pet" in our model that
defines the characteristic of domestic animal,
in rails, the database table created for us will
be named "pets"
Other chunks of code look for each other by
their common names
Action Pack
Since views and controllers interact so tightly,
in rails they are combined in Action Pack
Action pack breaks a web request into view
components and controller compoents
So an action usually involves a controller
request to create, read, update, or delete
(CRUD) some part of the model, followed by
a view request to render a page
Processing URLs
The basic url used to access a controller is of
the form: http://server/controller/action
The controller will be one you generate, and
the action will be one you've defined in your
controller
So if you have a controller named "filer" and
that controller has an action named "upload",
the url will be something like
http://127.0.0.1/filer/upload
The View
The controller will have a folder in app/view
named after it, and in that will be the view
templates associated with the action methods
These templates are usually html with some
inserted ruby code
While code can be executed in these
templates, keep that simple--any data
controls should be made in the controller's
files
Creating a basic site
Three commands
rails demo
cd demo
ruby script/generate controller Bark
This creates the framework
Making it say something
A def in the
app/controller/bark_controller.rb file:
def hello
end
And some html in the app/views/bark
folder, hello.html.erb:
<html><head></head>
<body>
<h3>Howdy</h3>
</body>
</html>
Directory Structure
app: most of your code lives here
config: information environment and
database link
database.yml
development, test and production versions
doc, log, tmp
lib: your code, just a place to stick things that
don't have a good home elsewhere
Directory Structure
public: images, javascripts, stylesheets go
here
script: script that rails uses, most of these are
short and reference files in the lib dir for rails
vendor: 3rd party code
Generating a database site
Magic
rails temp
cd temp
rake db:create:all
ruby script/generate scaffold Person lname:string
fname:string email:string
rake db:migrate
ruby script/server
Sources
http://github.com/rails/rails/tree/master/actionpack
http://en.wikipedia.org/wiki/Ruby_on_Rails
http://www.whytheluckystiff.net/ruby/pickaxe/
http://www.pragprog.com/titles/rails3/agile-webdevelopment-with-rails-third-edition
http://www.juixe.com/techknow/index.php/2007/01
/22/ruby-class-tutorial/