Ruby on Rails Introduction

              -Manmay S. Kudale   (manmays@gmail.com)

 

What is Ruby?

Before we ride on Rails, let's know a little bit about Ruby which is the base of Rails.

Ruby is the successful combination of:

  • Smalltalk's conceptual elegance,
  • Python's ease of use and learning, and
  • Perl's pragmatism

Ruby is

  • A High Level Programming Language
  • Interpreted like Perl, Python, Tcl/TK.
  • Object-Oriented Like Smalltalk, Eiffel, Ada, Java.
  • Originated in Japan and Rapidly Gaining Mindshare in US and Europe.

Why Ruby ?

Ruby is becoming popular exponentially in Japan and now in US and Europe as well. Following are greatest factors:

  • Easy to learn
  • Open source (very liberal license)
  • Rich libraries
  • Very easy to extend
  • Truly Object-Oriented
  • Less Coding with fewer bugs
  • Helpful community

Why Not Ruby ?

  • Performance - Although it rivals Perl and Python.
  • Threading model does not use native threads.

Sample Ruby Code:

Here is a sample Ruby code to print "Hello Ruby"

   # The Hello Class

   class Hello

      def initialize( name )

         @name = name.capitalize

      end

 

      def salute

         puts "Hello #{@name}!"

      end

   end

   # Create a new object

   h = Hello.new("Ruby")

   # Output "Hello Ruby!"

   h.salute

Embedded Ruby:

Ruby provides you with a program called ERb (Embedded Ruby), written by Seki Masatoshi. ERb allows you to put Ruby code inside an HTML file. ERb reads along, word for word, and then at a certain point when it sees the Ruby code embedded in the document it sees that it has to fill in a blank, which it does by executing the Ruby code.

You need to know only two things to prepare an ERb document:

  • If you want some Ruby code executed, enclose it between <% and %>
  • If you want the result of the code execution to be printed out, as part of the output, enclose the code between <%= and %>.

Here's an example, Save the code in erbdemo.rb file. Please note that a ruby file will have extension .rb

<% page_title = "Demonstration of ERb" %>

<% salutation = "Dear programmer," %>

<html>

<head>

<title><%= page_title %></title>

</head>

<body>

<p><%= salutation %></p>

<p>This is an example of how ERb fills out a template.</p>

</body>

</html>

Now, run the program using the command-line utility erb

c:\ruby\>erb erbdemo.rb

This will produce following result:

<html>

<head>

<title>Demonstration of ERb</title>

</head>

<body>

<p>Dear programmer,</p>

<p>This is an example  of how ERb fills out a template.</p>

</body>

</html>

What is Rails

  • An extremely productive web-application framework.
  • Written in Ruby by David Heinemeier Hansson.
  • You could develop a web application at least ten times faster with Rails than you could with a typical Java framework.
  • An open source Ruby framework for developing database-backed web applications.
  • Your code and database schema are the configuration!
  • No compilation phase required.

Full Stack Framework

  • Includes everything needed to create a database-driven web application using the Model-View-Controller pattern.
  • Being a full-stack framework means that all layers are built to work seamlessly together Less Code.
  • Requires fewer total lines of code than other frameworks spend setting up their XML configuration files.

Convention over Configuration

  • Rails shuns configuration files in favor of conventions, reflection and dynamic run-time extensions. Your application code and your running database already contain everything that Rails needs to know!

Rails Strengths:

Rails is packed with features that make you more productive, with many of the following features building on one other.

Metaprogramming : Other frameworks use extensive code generation from scratch. Metaprogramming techniques use programs to write programs. Ruby is one of the best languages for metaprogramming, and Rails uses this capability well. Rails also uses code generation but relies much more on metaprogramming for the heavy lifting.

Active Record : Rails introduces the Active Record framework, which saves objects to the database. The Rails version of Active Record discovers the columns in a database schema and automatically attaches them to your domain objects using metaprogramming.

Convention over configuration: Most web development frameworks for .NET or Java force you to write pages of configuration code. If you follow suggested naming conventions, Rails doesn't need much configuration.

Scaffolding: You often create temporary code in the early stages of development to help get an application up quickly and see how major components work together. Rails automatically creates much of the scaffolding you'll need.

Built-in testing: Rails creates simple automated tests you can then extend. Rails also provides supporting code called harnesses and fixtures that make test cases easier to write and run. Ruby can then execute all your automated tests with the rake utility.

Three environments: Rails gives you three default environments: development, testing, and production. Each behaves slightly differently, making your entire software development cycle easier. For example, Rails creates a fresh copy of the Test database for each test run.

 

Ruby on Rails Installation

To develop a web application using Ruby on Rails Framework, install the following software:

  • Ruby
  • The Rails framework
  • A Web Server
  • A Database System

We assume that you already have installed a Web Server and Database System on your computer. You can always use the WEBrick Web Server, which comes with Ruby. Most sites, however, use Apache or lightTPD in production.

Rails works with many database systems, including MySQL,PostgreSQL, SQLite, Oracle, DB2 and SQL Server. Please refer to a corresponding Database System Setup manual to setup your database.

Let's look at the installation instructions for Rails on Windows, Mac OS X, and Linux.

Rails Installation on Windows:

1.     First, let's check to see if you already have Ruby installed. Bring up a command prompt and type ruby -v. If Ruby responds, and if it shows a version number at or above 1.8.2 then type gem --version. If you don't get an error, skip to step 3. Otherwise, we'll install a fresh Ruby.

2.     If Ruby is not installed, then download an installation package fromrubyinstaller.rubyforge.org. Follow the download link, and run the resulting installer. This is an exe like ruby186-25.exe and will be installed in a single click. You may as well install everything . It's a very small package, and you'll get RubyGems as well alongwith this package. Please check Release Notes for more detail.

3.     With RubyGems loaded, you can install all of Rails and its dependencies through the command line:

C:\> gem install rails --include-dependencies

NOTE: Above command may take some time to install all dependencies. Make sure you are connected to the internet while installing gems dependencies.

Congratulations! You are now on Rails over Windows.

Rails Installation on Mac OS X:

1.     First, let's check to see if you already have Ruby installed. Bring up a command prompt and type ruby -v. If Ruby responds, and if it shows a version number at or above 1.8.2 then skip to step 3. Otherwise, we'll install a fresh Ruby. To install a fresh copy of Ruby, the Unix instructions that follow should help.

2.     Next you have to install RubyGems. Go to rubygems.rubyforge.org and follow the download link. OS X will typically unpack the archive file for you, so all you have to do is navigate to the downloaded directory and (in the Terminal application) type.

tp> tar xzf rubygems-x.y.z.tar.gz
tp> cd rubygems-x.y.z
rubygems-x.y.z> sudo ruby setup.rb

3.     Now use RubyGems to install Rails. Still in the Terminal application, issue the following command.

tp> sudo gem install rails --include-dependencies

NOTE: Above command may take some time to install all dependencies. Make sure you are connected to the internet while installing gems dependencies.

Congratulations! You are now on Rails over Mac OS X.

Rails Installation on Linux:

1.     First, let's check to see if you already have Ruby installed. Bring up a command prompt and type ruby -v. If Ruby responds, and if it shows a version number at or above 1.8.2 then skip to step 3. Otherwise, we'll install a fresh Ruby.

2.     Download ruby-x.y.z.tar.gz from www.ruby-lang.org

3.     Untar the distribution, and enter the top-level directory.

4.     Do the usual open-source build as follows

tp> tar -xzf ruby-x.y.z.tar.gz
tp> cd ruby-x.y.z
ruby-x.y.z> ./configure
ruby-x.y.z> make
ruby-x.y.z> make test
ruby-x.y.z> make install

5.     Install RubyGems. Go to rubygems.rubyforge.org, and follow thedownload link. Once you have the file locally, enter the following in your shell window.

tp> tar -xzf rubygems-0.8.10.tar.gz
tp> cd rubygems-0.8.10
rubygems-0.8.10> ruby setup.rb

6.     Now use RubyGems to install Rails. Still in the shell, issue the following command.

tp> gem install rails --include-dependencies

NOTE: Above command may take some time to install all dependencies. Make sure you are connected to the internet while installing gems dependencies.

Congratulations! You are now on Rails over Linux.

Keeping Rails Up-to-Date:

Assuming you installed Rails using RubyGems, keeping up-to-date is relatively easy. Issue the following command:

tp> gem update rails

This will automatically update your Rails installation. The next time you restart your application it will pick up this latest version of Rails. While giving this command, make sure you are connected to the internet.

Installation Verification

You can verify if everything is setup according to your requirements or not. Use the following command to create a demo project.

tp> rails demo

This will generate a demo rail project, we will discuss about it later. Currently we have to check if environment is setup or not. Now next use the following command to run WEBrick web server on your machine.

tp> cd demo
tp> ruby script/server
=> Rails application started on http://0.0.0.0:3000
=> Ctrl-C to shutdown server; call with --help for options
[2007-02-26 09:16:43] INFO WEBrick 1.3.1
[2007-02-26 09:16:43] INFO ruby 1.8.2 (2004-08-24)...
[2007-02-26 09:16:43] INFO WEBrick::HTTPServer-start:pid=2836...
....

Now open your browser and type the following address text box.

http://localhost:3000

If everything is fine then you should have a message something like "Welcome aboard" or "Congratulations".

 

Ruby on Rails Framework

A framework is a program, set of programs, and/or code library that writes most of your application for you. When you use a framework, your job is to write the parts of the application that make it do the specific things you want.

When you set out to write a Rails application, leaving aside configuration and other housekeeping chores you have to perform three primary tasks:

·         Describe and model your application's domain: The domain is the universe of your application. The domain may be music store, university, dating service, address book, or hardware inventory. So here you to figure out what's in it, what entities exist in this universe and how the items in it relate to each other. This is equivalent to modeling database structure to keep the entities and their relationship.

·         Specify what can happen in this domain: The domain model is static, Now you have to get dynamic. Addresses can be added to an address book. Musical scores can be purchased from music stores. Users can log in to a dating service. Students can register for classes at a university. You need to identify all the possible scenarios or actions that the elements of your domain can participate in.

·         Choose and design the publicly available views of the domain: At this point, you can start thinking in Web-browser terms. Once you've decided that your domain has students, and that they can register for classes, you can envision a welcome page, a registration page, and a confirmation page etc.Each of these pages, or views, shows the user how things stand at certain point.

Based on the above three tasks, Ruby on Rails deals with a Model/View/Controller (MVC) framework.

Ruby on Rails MVC framework:

The Model View Controller principle divides the work of an application into three separate but closely cooperative subsystems.

Model (ActiveRecord ) :

Maintains the relationship between Object and Database and handles validation, association, transactions, and more.

This subsystem is implemented in ActiveRecord library which provides an interface and binding between the tables in a relational database and the Ruby program code that manipulates database records. Ruby method names are automatically generated from the field names of database tables, and so on.

View ( ActionView )

A presentation of data in a particular format, triggered by a controller's decision to present the data. They are script based templating systems like JSP, ASP, PHP and very easy to integrate with AJAX technology.

This subsystem is implemented in ActionView library which is an Embedded Ruby (ERb) based system for defining presentation templates for data presentation. Every Web connection to a Rails application results in the displaying of a view.

Controller ( ActionController ):

The facility within the application that directs traffic, on the one hand querying the models for specific data, and on the other hand organizing that data (searching, sorting, massaging it) into a form that fits the needs of a given view.

This subsystem is implemented in ActionController which is a data broker sitting between ActiveRecord (the database interface) and ActionView (the presentation engine).

Pictorial Representation of MVC Framework:

A Pictorial Diagram of Ruby on Rails Framework is given here:

Directory Representation of MVC Framework:

Assuming a standard, default installation over Linux, you can find them like this:

tp> cd /usr/local/lib/ruby/gems/1.8/gems
tp> ls

You will see subdirectories including (but not limited to) the following:

  • actionpack-x.y.z
  • activerecord-x.y.z
  • rails-x.y.z

Over a windows installation you can find them link this:

C:\>cd ruby\lib\ruby\gems\1.8\gems
C:\ruby\lib\ruby\gems\1.8\gems\>dir

You will see subdirectories including (but not limited to) the following:

  • actionpack-x.y.z
  • activerecord-x.y.z
  • rails-x.y.z

ActionView and ActionController are bundled together under ActionPack.

ActiveRecord provides a range of programming techniques and shortcuts for manipulating data from an SQL database. ActionController and ActionView provide facilities for manipulating and displaying that data. Rails ties it all together.

 

Ruby on Rails Directory Structure

When you use the rails helper script to create your application, it creates the entire directory structure for the application. Rails knows where to find things it needs within this structure, so you don't have to tell it.

Here is a top level view of directory tree created by helper script at the time of application creation. Except for minor changes between releases, every Rails project will have the same structure, with the same naming conventions. This consistency gives you a tremendous advantage; you can quickly move between Rails projects without relearning the project's organization.

To understand this directory structure let's use demo application created in installation chapter. This can be created using a simple helper command C:\ruby\> rails demo.

Now go into demo application root directory as follows:

C:\ruby\> cd demo

C:\ruby\demo> dir

You will find a directory structure as follows:

demo/

..../app

......../controller

......../helpers

......../models

......../views

............../layouts

..../components

..../config

..../db

..../doc

..../lib

..../log

..../public

..../script

..../test

..../tmp

..../vendor

README

Rakefile

Now let's explain the purpose of each directory

app : This organizes your application components. It's got subdirectories that hold the view (views and helpers), controller (controllers), and the backend business logic (models).

app/controllers: The controllers subdirectory is where Rails looks to find controller classes. A controller handles a web request from the user.

app/helpers: The helpers subdirectory holds any helper classes used to assist the model, view, and controller classes. This helps to keep the model, view, and controller code small, focused, and uncluttered.

app/models: The models subdirectory holds the classes that model and wrap the data stored in our application's database. In most frameworks, this part of the application can grow pretty messy, tedious, verbose, and error-prone. Rails makes it dead simple!

app/view: The views subdirectory holds the display templates to fill in with data from our application, convert to HTML, and return to the user's browser.

app/view/layouts: Holds the template files for layouts to be used with views. This models the common header/footer method of wrapping views. In your views, define a layout using the <tt>layout :default</tt> and create a file named default.rhtml. Inside default.rhtml, call <% yield %> to render the view using this layout.

 

components : This directory holds components tiny self-contained applications that bundle model, view, and controller.

config: This directory contains the small amount of configuration code that your application will need, including your database configuration (in database.yml), your Rails environment structure (environment.rb), and routing of incoming web requests (routes.rb). You can also tailor the behavior of the three Rails environments for test, development, and deployment with files found in the environments directory.

db: Usually, your Rails application will have model objects that access relational database tables. You can manage the relational database with scripts you create and place in this directory.

doc: Ruby has a framework, called RubyDoc, that can automatically generate documentation for code you create. You can assist RubyDoc with comments in your code. This directory holds all theR ubyDoc-generated Rails and application documentation.

lib: You'll put libraries here, unless they explicitly belong elsewhere (such as vendor libraries).

log: Error logs go here. Rails creates scripts that help you manage various error logs. You'll find separate logs for the server (server.log) and each Rails environment (development.log, test.log, and production.log).

public: Like the public directory for a web server, this directory has web files that don't change, such a s JavaScript files (public/javascripts), graphics (public/images), stylesheets (public/stylesheets), and HTML files (public).

script: This directory holds scripts to launch and manage the various tools that you'll use with Rails. For example, there are scripts to generate code (generate) and launch the web server (server).

test: The tests you write and those Rails creates for you all go here. You'll see a subdirectory for mocks (mocks), unit tests (unit), fixtures (fixtures), and functional tests (functional).

tmp: Rails uses this directory to hold temporary files for intermediate processing.

vendor: Libraries provided by third-party vendors (such as security libraries or database utilities beyond the basic Rails distribution) go here.

Apart from these directories there will be two files available in demo directory.

README: This file contains a basic detail about Rail Application and description of the directory structure explained above.

Rakefile: This file is similar to Unix Makefile which helps with building, packaging and testing the Rails code. This will be used by rake utility supplied along with Ruby installation.

Ruby on Rails Examples

Subsequent chapters are based on the example given in this chapter. In this example we will create something simple but operational online library system for holding and managing the books.

Now you have to be patient till you go through next few chapters. I'm sure after completing this tutorial you will have complete understanding on Rails.

This application has a basic architecture and will be built using two ActiveRecord models to describe the types of data that is stored:

·         Books, which describes an actual listing.

·         Subject, which is used to group books together.

Workflow for creating Rails applications:

A recommended workflow for creating Rails Application is as follows:

·         Use the rails command to create the basic skeleton of the application.

·         Create a database on the MySQL server to hold your data.

·         Configure the application to know where your database is located and the login credentials for it.

·         Create Rails Active Records ( Models ) because they are the business objects you'll be working with in your controllers.

·         Generate Migrations that makes creating and maintaining database tables and columns easy.

·         Write Controller Code to put a life in your application.

·         Create Views to present your data through User Interface.

So lets start with creating our library application.

Creating an Empty Rails Web Application:

Rails is both a runtime web application framework and a set of helper scripts that automate many of the things you do when developing a web application. In this step, we will use one such helper script to create the entire directory structure and the initial set of files to start our Library System application.

1.     Go into ruby installation directory to create your application.

2.     Run the following command to create a skeleton for library application.

C:\ruby> rails library

This will create a subdirectory for the library application containing a complete directory tree of folders and files for an empty Rails application. Check a complete directory structure of the application. Check Rails Directory Structure for more detail.

Most of our development work will be creating and editing files in the library/appsubdirectories. Here's a quick rundown of how to use them:

·         The controllers subdirectory is where Rails looks to find controller classes. A controller handles a web request from the user.

·         The views subdirectory holds the display templates to fill in with data from our application, convert to HTML, and return to the user's browser.

·         The models subdirectory holds the classes that model and wrap the data stored in our application's database. In most frameworks, this part of the application can grow pretty messy, tedious, verbose, and error-prone. Rails makes it dead simple.

·         The helpers subdirectory holds any helper classes used to assist the model, view, and controller classes. This helps to keep the model, view, and controller code small, focused, and uncluttered.

Starting Web Server:

Rails web application can run under virtually any web server, but the most convenient way to develop a Rails web application is to use the built-in WEBrick web server. Let's start this web server and then browse to our empty library application:

This server will be started from the application directory as follows. This runs on port number 3000.

C:\> cd ruby\library 
C:\ruby\library\> ruby script/server

This will start your WEBrick web server.

Now open your browser and browse to http://127.0.0.1:3000. If everything is gone fine then you should see a greeting message from WEBrick otherwise there is something wrong with your setting.

Rails Database Setup

Before starting with this chapter, make sure your database server is setup and running. Ruby on Rails recommends to create three databases: A database for each development, testing and production environment. According to convention their names should be:

  • library_development
  • library_production
  • library_test

You should initialize all three of them and create a user and password for them with full read and write privileges. I am using root user ID for my application. In MySQL, a console session in which you do this looks something like this:

mysql> create database library_development;
Query OK, 1 row affected (0.01 sec)
 
mysql> grant all privileges on library_development.*
to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
 
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

You can do same thing for two more databases library_production andlibrary_test.

Configuring database.yml:

At this point, you need to let Rails know about the user name and password for the databases. You do this in the file database.yml, available in theC:\ruby\library\config subdirectory of Rails Application you created. This file has live configuration sections for MySQL databases. In each of the sections you use, you need to change the username and password lines to reflect the permissions on the databases you've created.

When you finish, it should look something like:

development:
  adapter: mysql
  database: library_development
  username: root
  password: [password]
  host: localhost
test:
  adapter: mysql
  database: library_test
  username: root
  password: [password]
  host: localhost
production:
  adapter: mysql
  database: library_production
  username: root
  password: [password]
  host: localhost

NOTE: You can use similar setting for other databases if you are using any other database except MySQL.

 

 

Rails Active Records - Models

Rails Active Record is the Object/Relational Mapping (ORM) layer supplied with Rails. It closely follows the standard ORM model, which is as follows:

·         tables map to classes,

·         rows map to objects and

·         columns map to object attributes

Rails Active Records provides an interface and binding between the tables in a relational database and the Ruby program code that manipulates database records. Ruby method names are automatically generated from the field names of database tables.

Each Active Record object has CRUD (Create, Read, Update, and Delete) methods for database access. This strategy allows simple designs and straightforward mappings between database tables and application objects.

Translating a domain model into SQL:

Translating a domain model into SQL is generally straightforward, as long as you remember that you have to write Rails-friendly SQL. In practical terms you have to follow certain rules:

·         Each entity (such as book) gets a table in the database named after it, but in the plural (books).

·         Each such entity-matching table has a field called id, which contains a unique integer for each record inserted into the table.

·         Given entity x and entity y, if entity y belongs to entity x, then table y has a field called x_id.

·         The bulk of the fields in any table store the values for that entity's simple properties (anything that's a number or a string).

Creating Active Record files:

To create the Active Record files for our entities for library application, introduced in the previous chapter, issue the following command from the top level of the application directory.

C:\ruby\library\> ruby script/generate model Book
C:\ruby\library\> ruby script/generate model Subject

You're telling the generator to create models called Book, and Subject to store instances of books and subjects. Notice that you are capitalizing Book and Subject and using the singular form. This is a Rails paradigm that you should follow each time you create a model.

When you use the generate tool, Rails creates the actual model file that holds all the methods unique to the model and the business rules you define, a unit test file for performing test-driven development, a sample data file (called fixtures) to use with the unit tests, and a Rails migration that makes creating database tables and columns easy.

Apart from creating many other files and directories, this will create files namedbook.rb and subject.rb containing a skeleton definition in app/modelsdirectory.

Content available in book.rb

class Book < ActiveRecord::Base
end

Content available in subject.rb

class Subject < ActiveRecord::Base
end

Creating associations between models:

When you have more than one model in your rails application, you would need to create connection between those models. You can do this via associations. Active Record supports three types of associations:

·         one-to-one : A one-to-one relationship exists when one item has exactly one of another item. For example, a person has exactly one birthday or a dog has exactly one owner.

·         one-to-many : A one-to-many relationship exists when a single object can be a member of many other objects. For instance, one subject can have many books.

·         many-to-many : A many-to-many relationship exists when the first object is related to one or more of a second object, and the second object is related to one or many of the first object.

You indicate these associations by adding declarations to your models: has_one, has_many, belongs_to, and has_and_belongs_to_many.

So now you need to tell Rails what relationships you want to establish within the library data system. To do so, modify book.rb and subject.rb to look like this:

class Book < ActiveRecord::Base
  belongs_to :subject
end

Notice above I have used singular subject, because one Book can belong to a single Subject.

class Subject < ActiveRecord::Base
  has_many :books
end

Notice here I have used plural books, because one subject can have multiple books.

Implementing validations:

The implementation of validations is done in a Rails model. The data you are entering into the database is defined in the actual Rails model, so it only makes sense to define what valid data entails in the same location.

Open book.rb and put the following validations:

class Book < ActiveRecord::Base
  belongs_to :subject
  validates_presence_of :title
  validates_numericality_of :price, :message=>"Error Message"
end
  • validates_presence_of - protects "NOT NULL" fields against missing user input
  • validates_numericality_of - prevents the user entering non numeric data

Rails Migrations

Rails Migration allows you to use Ruby to define changes to your database schema, making it possible to use a version control system to keep things synchronized with the actual code.

This has many uses, including:

·         Teams of developers - if one person makes a schema change, the other developers just need to update, and run "rake migrate".

·         Production servers - run "rake migrate" when you roll out a new release to bring the database up to date as well.

·         Multiple machines - if you develop on both a desktop and a laptop, or in more than one location, migrations can help you keep them all synchronized.

What can Rails Migration do?

·         create_table(name, options)

·         drop_table(name)

·         rename_table(old_name, new_name)

·         add_column(table_name, column_name, type, options)

·         rename_column(table_name, column_name, new_column_name)

·         change_column(table_name, column_name, type, options)

·         remove_column(table_name, column_name)

·         add_index(table_name, column_name, index_type)

·         remove_index(table_name, column_name)

Migrations support all the basic data types: string, text, integer, float, datetime, timestamp, time, date, binary and boolean:

·         string - is for small data types such as a title.

·         text - is for longer pieces of textual data, such as the description.

·         integer - is for whole numbers.

·         float - is for decimals.

·         datetime and timestamp - store the date and time into a column.

·         date and time - store either the date only or time only.

·         binary - is for storing data such as images, audio, or movies.

·         boolean - is for storing true or false values.

Valid column options are:

·         limit ( :limit => “50” )

·         default (:default => “blah” )

·         null (:null => false implies NOT NULL)

NOTE: The activities done by Rails Migration can be done using any front end GUI or direct on SQL prompt but Rails Migration makes all those activities very easy.

Create the migrations:

Here is the generic syntax for creating a migration:

C:\ruby\application> ruby script/generate migration table_name

This will create the file db/migrate/001_table_name.rb. A migration file contains basic Ruby syntax that describes the data structure of a database table.

NOTE: Before running migration generator, its recommended to clean existing migrations generated by model generators.

We will create two migrations corresponding to our three tables books and subjects.

C:\ruby> cd library
C:\ruby\library> ruby script/generate migration books
C:\ruby\library> ruby script/generate migration subjects

Notice that you are using lower case for book and subject and using the plural form while creating migrations. This is a Rails paradigm that you should follow each time you create a Migration.

Edit the code to tell it what to do:

Go into db/migrate subdirectory of your application and edit each file one by one using any simple text editor.

Modify 001_books.rb as follows:

The ID column will be created automatically, so don't do it here as well.

class Books < ActiveRecord::Migration
  def self.up
     create_table :books do |t|
                    t.column :title, :string, :limit => 32, :null => false
                    t.column :price, :float
                    t.column :subject_id, :integer
                    t.column :description, :text
                    t.column :created_at, :timestamp
     end
  end
 
  def self.down
    drop_table :books
  end
end

The method self.up is used when migrating to a new version, self.down is used to roll back any changes if needed. At this moment above script will be used to create books table.

Modify 002_subjects.rb as follows:

class Subjects < ActiveRecord::Migration
  def self.up
      create_table :subjects do |t|
       t.column :name, :string
    end
    Subject.create :name => "Physics"
    Subject.create :name => "Mathematics"
    Subject.create :name => "Chemistry"
    Subject.create :name => "Psychology"
    Subject.create :name => "Geography"
  end
 
  def self.down
      drop_table :subjects
  end
end

Above script will be used to create subjects table and will create five records in the subjects table.

Run the migration:

Now you have created all the required migration files, its time to execute them against the database. To do this, go to a command prompt and go to the library directory, in which the application is located, and then type rake migratecommand as follows:

C:\ruby\library> rake db:migrate

This will create a "schema_info" table if it doesn't exist which tracks the current version of the database - each new migration will be a new version, and any new migrations will be run until your database is at the current version.

Rake is a Ruby build program similar to Unix make program that Rails takes advantage of to simplify the execution of complex tasks such as updating a database's structure etc.

Running migrations for production and test databases:

If you would like to specify what rails environment to use for the migration, use the RAILS_ENV shell variable.

For example:

C:\ruby\library> set RAILS_ENV=production
C:\ruby\library> rake db:migrate

                               

C:\ruby\library> set RAILS_ENV=test
C:\ruby\library> rake db:migrate

 

C:\ruby\library> set RAILS_ENV=development
C:\ruby\library> rake db:migrate

NOTE: On Unix, use "export RAILS_ENV=production" instead of set command.

Rails Controller - ActionController

The Rails controller is the logical center of your application. It coordinates the interaction between the user, the views, and the model. The controller is also a home to a number of important ancillary services.

·         It is responsible for routing external requests to internal actions. It handles people-friendly URLs extremely well.

·         It manages caching, which can give applications orders-of-magnitude performance boosts.

·         It manages helper modules, which extend the capabilities of the view templates without bulking up their code.

·         It manages sessions, giving users the impression of an ongoing interaction with our applications.

The process for creating a controller is very easy, and it's similar to the process we've already used for creating a model. We will create just one controller here:

C:\ruby\library\> ruby script/generate controller Book

Notice that you are capitalizing Book and using the singular form. This is a Rails paradigm that you should follow each time you create a controller.

This command accomplishes several tasks, of which the following are relevant here:

  • It creates a file called app/controllers/book_controller.rb

If you will have look at book_controller.rb, you will find it as follows:

class BookController < ApplicationController
end

Controller classes inherit from ApplicationController, which is the other file in the controllers folder: application.rb.

The ApplicationController contains code that can be run in all your controllers and it inherits from Rails ActionController::Base class.

You don't need to worry with the ApplicationController as of yet, so just let's define few method stubs in book_controller.rb. Based on your requirement, you could define any number of functions in this file.

Modify the file to look like the following and save your changes. Note that its upto you what name you want to give to these methods, but better to give relevant names.

class BookController < ApplicationController
   def list
   end
   def show
   end
   def new
   end
   def create
   end
   def edit
   end
   def update
   end
   def delete
   end
end

Now lets implement all the methods one by one.

Implementing the list Method

The list method gives you a printout of all the books in the database. This functionality will be achieved by the following lines of code.

   def list
      @books = Book.find(:all)
   end

The @books = Book.find(:all) line in the list method tells Rails to search the books table and store each row it finds in the @books instance object.

Implementing the show Method

The show method displays only further details on a single book. This functionality will be achieved by the following lines of code.

   def show
      @book = Book.find(params[:id])
   end

The show method's @books = Book.find(params[:id]) line tells Rails to find only the book that has the id defined in params[:id].

The params object is a container that enables you to pass values between method calls. For example, when you're on the page called by the list method, you can click a link for a specific book, and it passes the id of that book via the params object so that show can find the specific book.

Implementing the new Method

The new method lets Rails know that you will create a new object. So just add the following code in this method.

   def new
      @book = Book.new
      @subjects = Subject.find(:all)
   end

The above method will be called when you will display a page to the user to take user input. Here second line grabs all the subjects from the database and puts them in an array called @subjects.

Implementing the create Method

Once you take user input using HTML form, its time to create a record into the database. To achieve this, edit the create method in the book_controller.rb to match the following:

   def create
      @book = Book.new(params[:book])
      if @book.save
            redirect_to :action => 'list'
      else
            @subjects = Subject.find(:all)
            render :action => 'new'
      end
   end

The first line creates a new instance variable called @book that holds a Book object built from the data the user submitted. The data was passed from the new method to create using the params object.

The next line is a conditional statement that redirects the user to the list method if the object saves correctly to the database. If it doesn't save, the user is sent back to the new method. The redirect_to method is similar to performing a meta refresh on a web page: it automatically forwards you to your destination without any user interaction.

Then @subjects = Subject.find(:all) is required in case it does not save data successfully and it becomes similar case as with new option.

Implementing the edit Method

The edit method looks nearly identical to the show method. Both methods are used to retrieve a single object based on its id and display it on a page. The only difference is that the show method is not editable.

   def edit
      @book = Book.find(params[:id])
      @subjects = Subject.find(:all)
   end

This method will be called to display data on the screen to be modified by the user. The second line grabs all the subjects from the database and puts them in an array called @subjects.

Implementing the update Method

This method will be called after the edit method when user modifies a data and wants to update the changes into the database. The update method is similar to the create method and will be used to update existing books in the database.

   def update
      @book = Book.find(params[:id])
      if @book.update_attributes(params[:book])
         redirect_to :action => 'show', :id => @book
      else
         @subjects = Subject.find(:all)
         render :action => 'edit'
      end
   end

The update_attributes method is similar to the save method used by create but instead of creating a new row in the database, it overwrites the attributes of the existing row.

Then @subjects = Subject.find(:all) line is required in case it does not save data successfully then it becomes similar to edit option.

Implementing the delete Method

If you want to delete a record in to the database then you will use this method. Implement this method as follows.

   def delete
      Book.find(params[:id]).destroy
      redirect_to :action => 'list'
   end

The first line finds the classified based on the parameter passed via the params object and then deletes it using the destroy method. The second line redirects the user to the list method using a redirect_to call.

Additional Methods to Display Subjects:

Assume you want to give a facility to your users to browse all the books based on a given subject. So you can create a method inside book_controller.rb to display all the subjects. Assume method name is show_subjects:

   def show_subjects
      @subject = Subject.find(params[:id])
   end

Finally your book_controller.rb file will look like as follows:

class BookController < ApplicationController
   def list
      @books = Book.find(:all)
   end
   def show
      @book = Book.find(params[:id])
   end
   def new
      @book = Book.new
      @subjects = Subject.find(:all)
   end
   def create
      @book = Book.new(params[:book])
      if @book.save
            redirect_to :action => 'list'
      else
            @subjects = Subject.find(:all)
            render :action => 'new'
      end
   end
   def edit
      @book = Book.find(params[:id])
      @subjects = Subject.find(:all)
   end
   def update
      @book = Book.find(params[:id])
      if @book.update_attributes(params[:book])
         redirect_to :action => 'show', :id => @book
      else
         @subjects = Subject.find(:all)
         render :action => 'edit'
      end
   end
   def delete
      Book.find(params[:id]).destroy
      redirect_to :action => 'list'
   end
   def show_subjects
      @subject = Subject.find(params[:id])
   end
end

Now save your controller file and come out for next assignment.

Rails Views - ActionView

A Rails View is an ERb program that shares data with controllers through mutually accessible variables.

If you look in the app/views directory of the library application, you will see one subdirectory for each of the controllers we have created: book. Each of these subdirectories was created automatically when the same-named controller was created with the generate script.

Now, assuming your web server is up and running. Try to give following in your browser's address box:

http://localhost:3000/book/list

You get following error message because you have not defined any view file for any method defined in controller.

Rails lets you know that you need to create the view file for the new method. Each method you define in the controller needs to have a corresponding RHTML file, with the same name as the method, to display the data that the method is collecting.

So lets create view files for all the methods we have defined in book_controller.rb.

Creating view file for list method:

Create a file called list.rhtml using your favorite text editor and save it to app/views/book. After creating and saving the file, refresh your web browser. You should see a blank page; if you don't, check the spelling of your file and make sure that it is the exactly the same as your controller's method.

Now display actual content lets put following code into list.rhtml.

<% if @books.blank? %>
<p>There are not any books currently in the system.</p>
<% else %>
<p>These are the current books in our system</p>
<ul id="books">
<% @books.each do |c| %>
<li><%= link_to c.title, {:action => 'show', :id => c.id} -%></li>
<% end %>
</ul>
<% end %>
<p><%= link_to "Add new Book", {:action => 'new' }%></p>

The code to be executed is to check whether the @books array has any objects in it. The .blank? method returns true if the array is empty and false if it contains any objects. This @books object was created in controller inside list method.

The code between the <%= %> tags is a link_to method call. The first parameter of link_to is the text to be displayed between the <a> tags. The second parameter is what action is called when the link is clicked. In this case, it is the show method. The final parameter is the id of the book that is passed via the params object.

Now try refreshing your browser and you should get following screen because we don't have any book in our library.

Creating view file for new method:

Till now we don't have any book in our library. We have to create few books in the system. So lets design a view corresponding to new method defined in book_controller.rb.

Create a file called new.rhtml using your favorite text editor and save it to app/views/book. Add the following code to the new.rhtml file.

<h1>Add new book</h1>
<%= start_form_tag :action => 'create' %>
<p><label for="book_title">Title</label>:
<%= text_field 'book', 'title' %></p>
<p><label for="book_price">Price</label>:
<%= text_field 'book', 'price' %></p>
<p><label for="book_subject">Subject</label>:
<%= collection_select(:book,:subject_id,@subjects,:id,:name) %></p>
<p><label for="book_description">Description</label><br/>
<%= text_area 'book', 'description' %></p>
<%= submit_tag "Create" %>
<%= end_form_tag %>
<%= link_to 'Back', {:action => 'list'} %>

Here start_form_tag() method interprets the Ruby code into a regular HTML <form> tag using all the information supplied to it. This tag, for example, outputs the following HTML:

<form action="/book/create" method="post">

Next method is text_field that outputs an <input> text field. The parameters for text_field are object and field name. In this case, the object is book and the name is title

Rails method called collection_select, creates an HTML select menu built from an array, such as the @books one. There are five parameters, which are as follows:

·         :book - The object you are manipulating. In this case, it's a book object.

·         :subject_id - The field that is populated when the book is saved.

·         @books - The array you are working with.

·         :id - The value that is stored in the database. In terms of HTML, this is the <option> tag's value parameter

·         :name- The output that the user sees in the pull-down menu. This is the value between the <option> tags.

The next used is submit_tag, which outputs an <input> button that submits the form. Finally, there is the end_form_tag method that simply translates into </form>.

Go to your browser and visit http://localhost:3000/book/new. This will give you following screen.

Enter some data in this form and then click at Create button. This will result in a call to create method which does not need any view because this method is using either list or new methods to view the results. So when you click at Createbutton, the data should submit successfully and redirect you to the list page, in which you now have a single item listed as follows:

If you click the link, you should see another Template is missing error since you haven't created the template file for show method yet.

Creating view file for show method:

This method will display complete detail about any book available in the library. Create a show.rhtml file under app/views/book and populate it with the following code:

<h1><%= @book.title %></h1>
<p><strong>Price: </strong> $<%= @book.price %><br />
<strong>Subject :</strong> <%= @book.subject.name %><br />
<strong>Created Date:</strong> <%= @book.created_at %><br />
</p>
<p><%= @book.description %></p>
<hr />
<%= link_to 'Back', {:action => 'list'} %>

This is the first time you have taken full advantage of associations, which enable you to easily pull data from related objects.

The format used is @variable.relatedObject.column. In this instance, you can pull the subject's name value through the @book variable using the belongs_toassociations. If click on any listed record then it will show you following screen.

Creating view file for edit method:

Create a new file called edit.rhtml and save it in app/views/book. Populate it with the following code:

<h1>Edit Book Detail</h1>
<%= start_form_tag :action => 'update', :id => @book %>
<p><label for="book_title">Title</label>:
<%= text_field 'book', 'title' %></p>
<p><label for="book_price">Price</label>:
<%= text_field 'book', 'price' %></p>
<p><label for="book_subject">Subject</label>:
<%= collection_select(:book, :subject_id,
                         @subjects, :id, :name) %></p>
<p><label for="book_description">Description</label><br/>
<%= text_area 'book', 'description' %></p>
<%= submit_tag "Save changes" %>
<%= end_form_tag %>
<%= link_to 'Back', {:action => 'list' } %>

This code is very similar to new method except action to be updated instead of creating and defining an id.

At this point we need some modification in list method's view file. Go to the <li></li> element and modify it to look like the following:

<li>
<%= link_to c.title, {:action => "show", :id => c.id} -%>
<b> <%= link_to 'Edit', {:action => "edit",
:id => c.id} %></b>
</li>

Now try to browse books using http://localhost:3000/book/list. It will give you listing of all the books along with Edit option. When you click Edit option then you will have next screen as follows:

Now you edit this information and then click at Save Changes button. This will result in a call to update method available in controller file and it will update all the changed attribute. Notice that update method does not need any view file because it's using either show or edit methods to show its results.

Creating view file for delete method:

Removing information from a database using Ruby on Rails is almost too easy. You do not need to write any view code for delete method because this method is using list method to display the result. So let's just modify list.rhtml again and add a delete link.

Go to the <li></li> element and modify it to look like the following:

<li>
<%= link_to c.title, {:action => 'show', :id => c.id} -%>
<b> <%= link_to 'Edit', {:action => 'edit', :id => c.id} %></b>
<b> <%= link_to "Delete", {:action => 'delete', :id => c.id},
:confirm => "Are you sure you want to delete this item?" %></b>
</li>

The :confirm parameter presents a JavaScript confirmation box asking if you really want to perform the action. If the user clicks OK, the action proceeds, and the item is deleted.

Now try browsing books using http://localhost:3000/book/list. It will give you listing of all the books along with Edit and Delete options as follows:

Now using option Delete you can delete any listed record.

Creating view file for show_subjects method:

Create a new file, show_subjects.rhtml, in the app/views/book directory and add the following code to it:

<h1><%= @subject.name -%></h1>
<ul>
<% @subject.books.each do |c| %>
<li><%= link_to c.title, :action => "show", :id => c.id -%></li>
<% end %>
</ul>

You are taking advantage of associations by iterating through a single subject's many books listings.

Now modify the Subject: line of show.rhtml so that the subject listing shows a link.

<strong>Subject: </strong> <%= link_to @book.subject.name,
:action => "show_subjects", :id => @book.subject.id %><br />

This will output a list of subject on the index page, so that users can access them directly.

Modify list.rhtml to add the following to the top of the file:

<ul id="subjects">
<% Subject.find(:all).each do |c| %>
<li><%= link_to c.name, :action => "show_subjects", 
:id => c.id %></li>
<% end %>
</ul>

Now try browsing books using http://localhost:3000/book/list. It will display all subjects with links so that you can browse all the books related to that subject.

Rails Layouts:

A layout defines the surroundings of an HTML page. It's the place to define common look and feel of your final output. Layout files reside in app/views/layouts:

The process involves defining a layout template and then letting the controller know that it exists and to use it. First, let's create the template.

Add a new file called standard.rhtml to app/views/layouts. You let the controllers know what template to use by the name of the file, so following a sane naming scheme is advised.

Add the following code to the new standard.rhtml file and save your changes:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html;.
charset=iso-8859-1" />
<meta http-equiv="Content-Language" content="en-us" />
<title>Library Info System</title>
<%= stylesheet_link_tag "style" %>
</head>
<body id="library">
<div id="container">
<div id="header">
<h1>Library Info System</h1>
<h3>Library powered by Ruby on Rails</h3>
</div>
<div id="content">
<%= yield -%>
</div>
<div id="sidebar"></div>
</div>
</body>
</html>

Everything you just added were standard HTML elements except two lines. Thestylesheet_link_taghelper method outputs a stylesheet <link>. In this instance we are linking style.css style sheet. The yield command lets Rails know that it should put the RHTML for the method called here.

Now open book_controller.rb and add the following line just below the first line:

class BookController < ApplicationController
   layout 'standard'
   def list
      @books = Book.find(:all)
   end
...................

This tells to controller that we want to use a layout available in standard.rhtml file. Now try browsing books it will give following screen.

Adding Style Sheet:

Till now we have not created any style sheet, so Rails is using default style sheet. Now let's create a new file called style.css and save it in /public/stylesheets. Add the following code to this file.

body {
   font-family: Helvetica, Geneva, Arial, sans-serif;
   font-size: small;
   font-color: #000;
   background-color: #fff;
}
a:link, a:active, a:visited {
   color: #CD0000;
}
input { 
   margin-bottom: 5px;
}
p { 
   line-height: 150%;
}
div#container {
   width: 760px;
   margin: 0 auto;
}
div#header {
   text-align: center;
   padding-bottom: 15px;
}
div#content {
   float: left;
   width: 450px;
   padding: 10px;
}
div#content h3 {
   margin-top: 15px;
}
ul#books {
   list-style-type: none;
}
ul#books li {
   line-height: 140%;
}
div#sidebar {
   width: 200px;
   margin-left: 480px;
}
ul#subjects {
   width: 700px;
   text-align: center;
   padding: 5px;
   background-color: #ececec;
   border: 1px solid #ccc;
   margin-bottom: 20px;
}
ul#subjects li {
   display: inline;
   padding-left: 5px;
}

Now refresh your browser and see the difference:

Rails Scaffolding

While you're developing Rails applications, especially those which are mainly providing you with a simple interface to data in a database, it can often be useful to use the scaffold method.

Scaffolding provides more than cheap demo thrills. Here are some benefits:

  • You can quickly get code in front of your users for feedback.
  • You are motivated by faster success.
  • You can learn how Rails works by looking at generated code.
  • You can use the scaffolding as a foundation to jumpstarts your development.

Scaffolding Example:

To understand scaffolding lets create a database called cookbook and a table called recipes:

Creating an Empty Rails Web Application:

Open a command window and navigate to where you want to create this cookbookweb application. I used c:\ruby. So run the following command to create complete directory structure.

C:\ruby> rails cookbook

Setting up the Database:

Here is the way to create database:

mysql> create database cookbook;
Query OK, 1 row affected (0.01 sec)
 
mysql> grant all privileges on cookbook.*
to 'root'@'localhost' identified by 'password';
Query OK, 0 rows affected (0.00 sec)
 
mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

To tell Rails how to find the database, edit the configuration file c:\ruby\cookbook\config\database.yml and change the database name to cookbook. Leave the password empty. When you finish, it should look something like

development:
  adapter: mysql
  database: cookbook
  username: root
  password: [password]
  host: localhost
test:
  adapter: mysql
  database: cookbook
  username: root
  password: [password]
  host: localhost
production:
  adapter: mysql
  database: cookbook
  username: root
  password: [password]
  host: localhost

Rails lets you run in development mode, test mode, or production mode, using different databases. This application uses the same database for each.

 

Creating the database tables:

We will use following table for our practical purpose. So create recipes table from sql prompt as follows:

mysql> USE cookbook;
Changed database
mysql> CREATE TABLE recipes (
    -> id INT(11) NOT NULL AUTO_INCREMENT,
    -> title VARCHAR(40),
    -> instructions VARCHAR(255),
    -> PRIMARY KEY (id));
Query OK, 0 rows affected (0.06 Sec)

NOTE: If you wish you can use Rails Migrations to create and maintain tables.

Creating Model:

First, create a Recipe model class that will hold data from the recipes table in the database. Use the following command inside cookbook directory.

C:\ruby\cookbook > ruby script\generate model Recipe

Notice that you are capitalizing Recipe and using the singular form. This is a Rails paradigm that you should follow each time you create a model.

This will create a file named app/models/recipe.rb containing a skeleton definition for the Recipe class.

Creating Controller:

Now we have to create a recipe controller with actions to manipulate the recipes in the database via the standard CRUD operations: create, read, update, and delete.

C:\ruby\cookbook > ruby script\generate controller Recipe

Notice that you are capitalizing Recipe and using the singular form. This is a Rails paradigm that you should follow each time you create a controller.

This will create a file named app/controllers/recipe_controller.rb containing a skeleton definition for the RecipeController class. Edit this file and add the linescaffold:recipe as shown

class RecipeController < ApplicationController
   scaffold:recipe
end

This single line of code will bring the database table to life. This will provide with a simple interface to your data, and ways of:

  • Creating new entries
  • Editing current entries
  • Viewing current entries
  • Destroying current entries

When creating or editing an entry, scaffold will do all the hard work of form generation and handling for you, and will even provide clever form generation, supporting the following types of inputs:

  • Simple text strings
  • Textareas (or large blocks of text)
  • Date selectors
  • Datetime selectors

Now go into cookbook directory and run Web Server using following command:

C:\ruby\cookbook> ruby script/server

Now open a browser and navigate to http://127.0.0.1:3000/recipe/new, This will provide you a screen to create new entries in recipes table. A screen shot is shown below:

Once you press Create button to create anew recipe, your record is added into recipes table and it shows following result:

You can see option to edit, show and destroy the records. So play around these options.

You can also list down all the recipes available in the recipes table using URL http://127.0.0.1:3000/recipe/list

Enhancing the Model:

Rails gives you a lot of error handling for free. To understand this, add some validation rules to the empty recipe model:

Modify app/models/recipe.rb as follows and then test your application:

class Recipe < ActiveRecord::Base
   validates_length_of :title, :within => 1..20
   validates_uniqueness_of :title, :message => "already exists"
end

These entries will give automatic checking that:

  • validates_length_of: the field is not blank and not too long
  • validates_uniqueness_of: duplicate values are trapped. I don't like the default Rails error message - so I have given my custom message.

The Generated Scaffold Code:

With the scaffold action, Rails generates all the code it needs dynamically. By running scaffold as a script, we can get all the code written to disk where we can investigate it and then start tailoring it to our requirements.

So now let's start once again to generate Scaffold code manually by using scaffold helper script:

C:\ruby\cookbook> ruby script/generate scaffold recipe
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/recipes
      exists  app/views/layouts/
      exists  test/functional/
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
   identical    app/models/recipe.rb
   identical    test/unit/recipe_test.rb
   identical    test/fixtures/recipes.yml
      create  app/views/recipes/_form.rhtml
      create  app/views/recipes/list.rhtml
      create  app/views/recipes/show.rhtml
      create  app/views/recipes/new.rhtml
      create  app/views/recipes/edit.rhtml
      create  app/controllers/recipes_controller.rb
      create  test/functional/recipes_controller_test.rb
      create  app/helpers/recipes_helper.rb
      create  app/views/layouts/recipes.rhtml
      create  public/stylesheets/scaffold.css
C:\ruby\cookbook>

The Controller:

Let's look at the code behind the controller.This all code is generated by scaffoldgenerator. So if you will open app/controllers/recipes_controller.rb then you will find something as follows:

class RecipesController > ApplicationController
  def index
    list
    render :action => 'list'
  end
 
  verify :method => :post, :only => [ :destroy, :create, :update ],
         :redirect_to => { :action => :list }
 
  def list
    @recipe_pages, @recipes = paginate :recipes, :per_page => 10
  end
 
  def show
    @recipe = Recipe.find(params[:id])
  end
 
  def new
    @recipe = Recipe.new
  end
 
  def create
    @recipe = Recipe.new(params[:recipe])
    if @recipe.save
      flash[:notice] = 'Recipe was successfully created.'
      redirect_to :action => 'list'
    else
      render :action => 'new'
    end
  end
 
  def edit
    @recipe = Recipe.find(params[:id])
  end
 
  def update
    @recipe = Recipe.find(params[:id])
    if @recipe.update_attributes(params[:recipe])
      flash[:notice] = 'Recipe was successfully updated.'
      redirect_to :action => 'show', :id => @recipe
    else
      render :action => 'edit'
    end
  end
 
  def destroy
    Recipe.find(params[:id]).destroy
    redirect_to :action => 'list'
  end
end

When the user of a Rails application selects an action . e.g. "Show" - the controller will execute any code in the appropriate section - "def show" - and then by default will render a template of the same name - "show.rthml". This default behavior can be overwritten:

The controller uses ActiveRecord methods such as find, find_all, new, save, update_attributes, and destroy to move data to and from the database tables. Note that you do not have to write any SQL statements, rails will take care of it automatically.

The Views:

All the views and corresponding all the controller methods are created by scaffoldcommand and they are available in app/views/recipes directory.

How Scaffolding is Different?

If you have gone through previous chapters then you must have seen that we had created methods to list, show, delete and create data etc but scaffolding does that job automatically.