Jasig Rubyon Rails

43
Ruby on Rails: An Introduction JA-SIG Summer Conference 2007 Michael Irion The University of Tulsa

description

originally here: http://www.ja-sig.org/wiki/download/attachments/6063795/JASIG-RubyonRails.ppt

Transcript of Jasig Rubyon Rails

Page 1: Jasig Rubyon Rails

Ruby on Rails: An Introduction

JA-SIG Summer Conference 2007

Michael Irion

The University of Tulsa

Page 2: Jasig Rubyon Rails

What is Ruby on Rails (RoR)?

• Ruby on Rails is an open-source, full-stack framework for developing database-backed web applications according to the Model-View-Control pattern

Page 3: Jasig Rubyon Rails

Overview of Ruby on Rails

• Ruby is the programming language used to manipulate the framework

• Rails is the framework that provides the necessary infrastructure

• Rails is written in Ruby

Page 4: Jasig Rubyon Rails

Ruby Features

• Ruby is an interpreted language (No compile step necessary)

• Ruby is an Object Oriented language.• Everything is an object (No primitives)• Ruby draws from Perl, Smalltalk, and Lisp

Page 5: Jasig Rubyon Rails

Duck Typing in Ruby

• Objects are dynamic, and their types are determined at runtime

• The type of a Ruby object is much less important than it’s capabilities

• If a Ruby object walks like a duck and talks like a duck, then it can be treated as a duck

Page 6: Jasig Rubyon Rails

Rails Philosophy

• Convention over configuration (no XML)• Don’t Repeat Yourself (DRY)• Rails is opinionated

Page 7: Jasig Rubyon Rails

Rails Architecture

• Rails applications are implemented using the Model-View-Controller (MVC)

• Model - ActiveRecord• View - ActionView• Controller - ActionController

Page 8: Jasig Rubyon Rails

Starting the Bookmarks Application

• Generate application

> rails bookmarks

Page 9: Jasig Rubyon Rails

Directory Layout

• Rails applications have a common directory structure

• /app - the MVC core

/controllers

/helpers - provides extra functionality for views

/models

/views/nameofcontroller - templates for controller actions

Page 10: Jasig Rubyon Rails

Directory Layout

/components - will be deprecated

/config - database, route and environment configuration

/db - database schema and migrations

/lib - functions that don’t map to MVC

/log

/public - static web resources (html, css, javascript etc.)

/script - rails utilities

/test - tests and fixtures

/tmp

/vendor - 3rd party plugins

Page 11: Jasig Rubyon Rails

Rails Environment Modes

• Rails runs in different modes, depending on the parameters given to the server on startup. Each mode defaults to it’s own database schema

• Development (verbose logging and error messages)• Test• Production

Page 12: Jasig Rubyon Rails

Starting Rails

• > cd /directorypath/bookmarks

• Start the server

> ruby script/server start

• Default environment is development• Default port is 3000• http://127.0.0.1:3000

Page 13: Jasig Rubyon Rails

Welcome Aboard - Now What?

• Hello world seems appropriate>ruby script/generate controller hello exists app/controllers/ exists app/helpers/ create app/views/hello exists test/functional/ create app/controllers/hello_controller.rb create test/functional/hello_controller_test.rb create app/helpers/hello_helper.rb

Page 14: Jasig Rubyon Rails

Mapping URLs to Controllers and Actions

• http://127.0.0.1:3000/hello/sayit

• http://127.0.0.1:3000 - address and port of the webserver

• hello - name of the controller

• sayit - name of the action (method in controller)

Page 15: Jasig Rubyon Rails

Editing the Controller

def sayit

render :text => "<h2>Hello World!</h2>"

end

Page 16: Jasig Rubyon Rails

Now for an actual Bookmark

• Edit config/database.yml

development:

adapter: mysql

database: bookmarks_development

username: username

password: password

host: localhost

Page 17: Jasig Rubyon Rails

Create the Database

• This step depends on the database and dba tool of your choice. Create a new schema/dbname for bookmarks_development, and assign rights for the user you listed in database.yml.

Page 18: Jasig Rubyon Rails

Bookmark Model

• Our bookmark model will (initially) need two properties

• URL

• Title

Page 19: Jasig Rubyon Rails

Scaffolding for Bookmarks

• Rails can generate all the basic CRUD operations for simple models via scaffolding.

• Scaffolding is temporary way to get applications wired quickly.

> ruby script/generate scaffold_resource bookmark url:string title:string

Page 20: Jasig Rubyon Rails

Migrations

• Rails uses migrations to version the database.• Rails tries to minimize SQL at every opportunity• Migrations are automatically created whenever you

generate a new model• Migration files are located in db/migrations• The version number is stored in a table called

schema_info

Page 21: Jasig Rubyon Rails

Bookmarks Migration

located in db/migrate/001_create_bookmarks.rb

class CreateBookmarks < ActiveRecord::Migration def self.up create_table :bookmarks do |t| t.column :url, :string t.column :title, :string end end

def self.down drop_table :bookmarks endend

Page 22: Jasig Rubyon Rails

Running the Migration

• Rake is the general purpose build tool for rails, much like make, or ant. It has many functions, one of which is to control migrations.

>rake db:migrate

• Now the table has been created

Page 23: Jasig Rubyon Rails

Bookmarks Table ID

• Bookmarks table has the following fields - id, url, and title

• Where did the id field come from?• Convention of configuration - Rails automatically

creates an id field for each new table and uses it as the primary key

Page 24: Jasig Rubyon Rails

Bookmarks Controller

The /app/controllers/bookmarks.rb default action:

def index @bookmarks = Bookmark.find(:all)

respond_to do |format| format.html # index.rhtml format.xml { render :xml => @bookmarks.to_xml } endEnd

Page 25: Jasig Rubyon Rails

Mapping URLs to Controllers and Actions

• http://127.0.0.1:3000/bookmarks/

• http://127.0.0.1:3000 - address and port of the webserver

• hello - name of the controller

• / - name of the action (blank maps to the index action)

Page 26: Jasig Rubyon Rails

Bookmarks Model - Don’t Repeat Yourself

• No getters/setters. Rails uses information from the database.

class Bookmark < ActiveRecord::Base

end

Page 27: Jasig Rubyon Rails

Bookmarks View

Located in views/bookmarks/index.rhtml

<% for bookmark in @bookmarks %> <tr> <td><%=h bookmark.url %></td> <td><%=h bookmark.title %></td> <td><%=h bookmark.description %></td> <td><%= link_to 'Show', bookmark_path(bookmark) %></td> <td><%= link_to 'Edit', edit_bookmark_path(bookmark) %></td> <td><%= link_to 'Destroy', bookmark_path(bookmark), :confirm => 'Are you

sure?', :method => :delete %></td> </tr><% end %>

Page 28: Jasig Rubyon Rails

Convention over Configuration

• Bookmark model automatically looks for a table in the database with a plural form of it’s name. (bookmarks)

• The Bookmarks controller automatically renders the template located in views according to the controller name and the action (views/bookmarks/index.rhtml)

Page 29: Jasig Rubyon Rails

Ajax Helpers

• Rails allows you to program many AJAX calls in ruby, instead of writing javascript directly

• Script.aculo.us and Prototype libraries are included• A quick example. Autocomplete for text boxes

Page 30: Jasig Rubyon Rails

AJAX Autocomplete

Add to Bookmarks controller

auto_complete_for :bookmarks, :url

Add to views/bookmarks/edit.rhtml

<%= text_field_with_auto_complete :bookmark, :url %>

In views/layouts/bookmarks.rhtml, add

<%= javascript_include_tag :defaults %>

Page 31: Jasig Rubyon Rails

Validations

• Rails has a number of validation helpers that can be added to the model.

class Bookmark < ActiveRecord::Base

validates_presence_of :url, :title

end

Page 32: Jasig Rubyon Rails

Validations

• validates_presence_of • validates_length_of • validates_acceptance_of • validates_confirmation_of • validates_uniqueness_of• validates_format_of • validates_numericality_of • validates_inclusion_in • validates_exclusion_of • validates_associated :relation

Page 33: Jasig Rubyon Rails

Associations - Adding Categories to Bookmarks

• The bookmarks are working great, but it would be nice if we could group them by category

• Rails uses associations to build relationships between tables

• Associations are independent of database foreign key constraints

Page 34: Jasig Rubyon Rails

Types of Associations

• has_one• belongs_to• has_many• has_and_belongs_to_many• has_many :model1, :through => :model2

Page 35: Jasig Rubyon Rails

Changes to the Database

• A new categories table needs to be created• A category_id field needs to be added to the bookmarks

table> ruby script/generate scaffold_resource category name:string

• This creates the all the scaffolding and the migration db/migrate/002_create_categories.rb

• Note the category table is pluralized as categories.>ruby script/generate migration alter_bookmarks_add_category_id

• This creates db/migrate/003_alter_bookmarks_add_category_id.rb

Page 36: Jasig Rubyon Rails

Alter Bookmarks Migration

def self.up add_column :bookmarks, :category_id, :integerend

def self.down remove_column :bookmarks, :category_idend

>rake db:migrate

Page 37: Jasig Rubyon Rails

Types of Associations

• has_one• belongs_to• has_many• has_and_belongs_to_many• has_many :model1, :through => :model2

Page 38: Jasig Rubyon Rails

Database Relationships

• Parent (or Master) models that have collections of other models use the has_many relationship

• Child (or Detail) models contain the id field of their parent record and they use the belongs_to relationship

Page 39: Jasig Rubyon Rails

Associations Model Code

class Bookmark < ActiveRecord::Base validates_presence_of :url, :title belongs_to :categoryend

class Category < ActiveRecord::Base has_many :bookmarksend

Page 40: Jasig Rubyon Rails

Associations Controller code

def edit

@bookmark = Bookmark.find(params[:id])

@categories = Category.find(:all)

end

Page 41: Jasig Rubyon Rails

Associations View Code

<p>

<b>Category</b><br />

<%= collection_select('bookmark', 'category_id', @categories, 'id', 'name') %>

</p>

Page 42: Jasig Rubyon Rails

Tools

• Textmate (Mac OS X)• RadRails (Eclipse plugin) www.radrails.org• Other commercial and opensource IDEs are being

made available

Page 43: Jasig Rubyon Rails

Resources

• Programming Ruby: The Pragmatic Programmers' Guide - Second Edition

• Agile Web Development with Rails—Second Edition

• Rails main site http://www.rubyonrails.com• My email: [email protected]