Ruby on Rails

Preview:

Citation preview

A programming language Developed by Yukihiro Matsumoto (aka

Matz) in the 1990s

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 is largely and loosely based on perl (hence the name, according to lore)

Completely object oriented

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

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

Ruby is an interpreter, just like php or bash:Avatar:~ hays$ rubyprint "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>>

Truly Not a prototyping language like javascript Nor a procedural language with OOP bolted

on

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

class Catend

(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/

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

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")

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

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"

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

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

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

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)

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…

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

use the each method:

a = 1 my_hash.each do |key, value| puts "#{a} #{key} is: #{value}" a = a +1 end

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

Ruby's syntax is pretty Ruby is all about structure Classes are easy to work with, if you're new,

start with simple examples

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

Contains the data of the application◦ Transient◦ Stored (eg Database)

Enforces "business" rules of the application◦ Attributes◦ Work flow

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)

Perform the bulk of the heavy lifting Handles web requests Maintains session state Performs caching Manages helper modules

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

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

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 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

Three commandsrails democd demoruby script/generate controller Bark

This creates the framework

A def in the app/controller/bark_controller.rb file:def helloend

And some html in the app/views/bark folder, hello.html.erb:

<html><head></head><body><h3>Howdy</h3></body></html>

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

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

Magic

rails tempcd temprake db:create:allruby script/generate scaffold Person lname:string fname:string email:stringrake db:migrateruby script/server