Rubyonrails in 24 Hours For Newbies by Ajay1kumar1
Rubyonrails in 24 Hours For Newbies by Ajay1kumar1
Rubyonrails in 24 Hours For Newbies by Ajay1kumar1
Before we ride on Rails, let's know a little bit about Ruby which is the base of Rails.
Ruby is
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
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.
• 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
c:\ruby\>erb erbdemo.rb
<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.
Rails Strengths:
Rails is packed with features that make you more productive, with many of the following
features building on one other.
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.
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.
Let's look at the installation instructions for Rails on Windows, Mac OS X, and Linux.
NOTE: Above command may take some time to install all dependencies. Make sure you
are connected to the internet while installing gems dependencies.
3. Now use RubyGems to install Rails. Still in the Terminal application, issue the
following command.
NOTE: Above command may take some time to install all dependencies. Make sure you
are connected to the internet while installing gems dependencies.
6. Now use RubyGems to install Rails. Still in the shell, issue the following
command.
NOTE: Above command may take some time to install all dependencies. Make sure you
are connected to the internet while installing gems dependencies.
Assuming you installed Rails using RubyGems, keeping up-to-date is relatively easy.
Issue the following command:
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.
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".
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.
Model (ActiveRecord ) :
Maintains the relationship between Object and Database and handles validation,
association, transactions, and more.
View ( ActionView )
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.
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
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.
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.
C:\ruby\> cd demo
C:\ruby\demo> dir
demo/
..../app
......../controller
......../helpers
......../models
......../views
............../layouts
..../components
..../config
..../db
..../doc
..../lib
..../log
..../public
..../script
..../test
..../tmp
..../vendor
README
Rakefile
• 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.
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:
• 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.
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/app
subdirectories. Here's a quick rundown of how to use them:
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
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.
What is next ?
Next session will teach you how to create databases for your application and what is the
configuration required to access these created databases.
Further we will see what is Rail Migration and how it is used to maintain database tables.
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:
You can do same thing for two more databases library_production and library_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 the C:\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.
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.
What is next ?
Next two chapters will teach you how to model your database tables and how to manage
them using Rails Migrations.
Rails Active Record is the Object/Relational Mapping (ORM) layer supplied with Rails.
It closely follows the standard ORM model, which is as follows:
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.
• 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).
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 named book.rb
and subject.rb containing a skeleton definition in app/models directory.
• 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.
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:
Notice above I have used singular subject, because one Book can belong to a single
Subject.
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:
Besides the validations mentioned above, there are other common validations Check
Rails Quick Guide.
What is Next?
In the next chapter we will learn Rails Migration which 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.
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.
• 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.
Migrations support all the basic data types: string, text, integer, float, datetime,
timestamp, time, date, binary and boolean:
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.
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.
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.
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.
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.
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.
For example:
What is Next?
Now we have our Database and required Tables available. In the two subsequent chapters
we will explore two important components called Controller (ActionController) and View
(ActionView).
1. Creating Controllers ( Action Controller )
2. Creating Views ( Action View )
Rails Controllers
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.
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:
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:
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.
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.
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.
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.
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.
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.
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.
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.
def show_subjects
@subject = Subject.find(params[:id])
end
Now save your controller file and come out for next assignment.
What is Next?
You have created almost all methods which will work on backend. Next we will create
code to generate screens to display data and to take input from the user.
Rails Views
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.
Now display actual content lets put following code into list.rhtml.
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.
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:
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>.
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 Create button, 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.
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_to associations. 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:
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.
<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.
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.
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.
What is Next?
Hope now you are feeling comfortable with all the Rails Operations.
Next chapter will explain you how to use Layouts to put your data in better way. I will
show you how to use CSS in your Rails Applications.
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:
Everything you just added were standard HTML elements except two lines. The
stylesheet_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:
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;
}
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:
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.
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.
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 single line of code will bring the database table to life. This will provide with a
simple interface to your data, and ways of:
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:
Now go into cookbook directory and run Web Server using following command:
C:\ruby\cookbook> ruby script/server
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
So now let's start once again to generate Scaffold code manually by using scaffold helper
script:
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 scaffold
command and they are available in app/views/recipes directory.
Ajax stands for Asynchronous JavaScript and XML. Ajax is not a single technology; it is
a suite of several technologies. Ajax incorporates the following:
Ajax enables you to retrieve data for a web page without having to refresh the contents of
the entire page. In the basic web architecture, the user clicks a link or submits a form. The
form is submitted to the server, which then sends back a response. The response is then
displayed for the user on a new page.
When you interact with an Ajax-powered web page, it loads an Ajax engine in the
background. The engine is written in JavaScript and its responsibility is to both
communicate with the web server and display the results to the user. When you submit
data using an Ajax-powered form, the server returns an HTML fragment that contains the
server's response and displays only the data that is new or changed as opposed to
refreshing the entire page.
For a complete detail on AJAX you can go through our AJAX Tutorial
• Some trigger fires :This trigger could be the user clicking on a button or link, the
user making changes to the data on a form or in a field, or just a periodic trigger
(based on a timer)
• The web client calls the server: A JavaScript method, XMLHttpRequest, sends
data associated with the trigger to an action handler on the server. The data might
be the ID of a checkbox, the text in an entry field, or a whole form.
• The server does processing: The server-side action handler ( Rails controller
action )-- does something with the data and returns an HTML fragment to the web
client.
• The client receives the response: The client-side JavaScript, which Rails creates
automatically, receives the HTML fragment and uses it to update a specified part
of the current page's HTML, often the content of a <div> tag.
These steps are the simplest way to use Ajax in a Rails application, but with a little extra
work, you can have the server return any kind of data in response to an Ajax request, and
you can create custom JavaScript in the browser to perform more involved interactions.
AJAX Example:
While discussing rest of the Rails concepts, we have taken an example of Library. There
we have a table called subject and we had added few subjects at the time of Migration.
Till now we have not provided any procedure to add and delete subjects in this table.
In this example we will provide, list, show and create operations on subject table. If you
don't have any understanding on Library Info System explained in previous chapters then
I would suggest you to complete previous chapters first and then continue with AJAX on
Rails.
Creating Controller:
So lets start with creation of a controller for subject, this will be done as follows:
C:\ruby\library> ruby script/generate controller Subject
Now we will give implementation for all these functions in the same way we had given in
previous chapters.
This is similar to the example explained earlier and will be used to list down all the
subjects available in our database.
This is also similar to the example explained earlier and will be used to display a
particular subject corresponding to passed ID.
This is bit new here. Here we are not redirecting page to any other page but just rendering
only changed part instead of whole page.
This happens possible only when using partial. We don't write complete view file,
instead we will write a partial in /app/view/subject directory. We will see it in a moment.
First let's create view files for other methods.
Creating Views:
Now we will create view files for all the methods except for create method for which we
will create a partial.
Create a file list.rhtml in /app/view/subject and populate it with the following code.
<h1>Listing Subjects</h1>
<ul id="subject_list">
<% @subjects.each do |c| %>
<li><%= link_to c.name, :action => 'show', :id => c.id %>
<%= "(#{c.books.count})" -%></li>
<% end %>
</ul>
Here you are iterating through the @subjects array and outputting a <li> element
containing a link to the subject it is referencing for each item in the array. Additionally,
you are outputting the number of books in that specific subject inside parentheses. Rails'
associations make it easy to step through a relationship and get information like this.
Now try browsing your Subject list using http://localhost:3000/subject/list. It will show
you following screen.
Creating view for show method:
Create a file show.rhtml in /app/view/subject and populate it with the following code.
Now try clicking on any subject and you will find a listing of all the books available
under that subject.
We would not create view for create method because we are using partial instead of
view. So in next section we will create a partial for create method.
This includes both the Prototype and script.aculo.us libraries in the template so their
effects will be accessible from any of the views.
The second section is the creation of the add_subject <div>. Notice that you set its
visibility to be hidden by default using the CSS display property. The preceding
link_to_function is what will change this property and show the <div> to the user to take
input required to add a new subject.
Next, you are creating the Ajax form using the form_remote_tag. This Rails helper is
similar to the start_form_tag tag, but it is used here to let the Rails framework know that
it needs to trigger an Ajax action for this method. The form_remote_tag takes the :action
parameter just like start_form_tag.
• The :update parameter tells Rails' Ajax engine which element to update based on
its id. In this case, it's the <ul> tag.
• The :position parameter tells the engine where to place the newly added object in
the DOM. You can set it to be at the bottom of the unordered list (:bottom) or at
the top (:top).
Next, you create the standard form fields and submit buttons as before and then wrap
things up with an end_form_tag to close the <form> tag. Make sure that things are
semantically correct and valid XHTML.
Under app/views/subject, create a new file called _subject.rhtml. Notice that all the
partials are named with an underscore (_) at the beginning.
You are done now....you can now easily add several subjects without having to wait for
the page to refresh after each subject is added. Now try browsing your Subject list using
http://localhost:3000/subject/list. It will show you following screen. Try to add some
subject.
When you press Add button, subject would be added at the bottom of all available
subjects and you would not have a feel of page refresh.
You may have a requirement in which you want your site visitors to upload a file on your
server. Rails makes it very easy to handle this requirement. Now we will proceed with a
simple and small Rails project.
As usual, let's start off with a new Rails application called upload. So let's create basic
structure of the application by using simple rails command.
Now let's decide where you would like to save your uploaded files. Assume this is data
directory inside your public section. So create this directory and check the permissions.
C:\ruby> cd upload
C:\ruby> mkdir upload\public\data
Our next step will be as usual, to create controller and models, so let's do that:
Creating Model:
Because this is not a database based application so we can keep name whatever is
comfortable to us. Assume we have to create a DataFile model.
Now we will create a method called save in data_file.rb model file. This method will be
called by the application controller.
The above function will take CGI object upload and will extract uploaded file name
using helper function original_filename and finally it will store uploaded file into
"public/data" directory. You can call helper function content_type to know media type of
the uploaded file.
Here File is a ruby object and join is a helper function will concatenate directory name
alongwith file name and will return full file path.
Next, to open a file in write mode we are using open helper function provided by File
object. Further we are reading data from the passed data file and writing into output file.
Creating Controller:
Now let's create a controller for our upload project:
Now we will create two controller functions first function index will call a view file to
take user input and second function uploadFile takes file information from the user and
passes it to the 'DataFile' model. We set the upload directory to the 'uploads' directory we
created earlier "directory = 'data'".
Here we are calling function defined in model file. The render function is being used to
redirect to view file as well as to display a message.
Creating View:
Finally we will create a view file uploadfile.rhtml which we have mentioned in
controller. Populate this file with the following code:
<h1>File Upload</h1>
<%= start_form_tag ({:action => 'uploadFile'},
:multipart => true) %>
<p><label for="upload_file">Select File</label> :
<%= file_field 'upload', 'datafile' %></p>
<%= submit_tag "Upload" %>
<%= end_form_tag %>
Here everything is same what we have explained in earlier chapters. Only new tag is
file_field which will create a button to select a file from user's computer.
By setting the multipart parameter to true, you ensure that your action properly passes
along the binary data from the file.
Here important point to note is that we have given uploadFile method name in :action,
which will be called when your will click Upload button.
NOTE: If a file with the same name already exists in your output directory then it will be
over-written.
instead of just:
My File.jpg
This is easily handled by File.basename, which strips out everything before the filename.
def sanitize_filename(file_name)
# get only the filename, not the whole path (from IE)
just_filename = File.basename(file_name)
# replace all none alphanumeric, underscore or perioids
# with underscore
just_filename.sub(/[^\w\.\-]/,'_')
end
def cleanup
File.delete("#{RAILS_ROOT}/dirname/#{@filename}")
if File.exist?("#{RAILS_ROOT}/dirname/#{@filename}")
end
For a complete detail on File object, you need to go through Ruby Reference Manual.
Action Mailer is the Rails component that enables applications to send and receive e-
mail. In this chapter we will see how to send an email using Rails. So lets start with
creating a emails project using following command.
This will create required framework to proceed. Now we will start with configuring
Action Mailer.
Go into config folder of your emails project and open environment.rb file and add the
following line at the bottom of this file.
ActionMailer::Base.delivery_method = :smtp
This tells ActionMailer that you want to user SMTP server. You can also set it to be
:sendmail if you are using a Unix-based operating system such as Mac OS X or Linux.
Add the following lines of code to the bottom of your environment.rb as well.
ActionMailer::Base.server_settings = {
:address => "smtp.tutorialspoint.com",
:port => 25,
:domain => "tutorialspoint.com",
:authentication => :login,
:user_name => "username",
:password => "password",
}
Replace each hash value with proper settings for your Simple Mail Transfer Protocol
(SMTP) server. You can take this information from your Internet Service Provider if you
already don't know. You don't need to change port number 25 and authentication type if
you are using standard SMTP server.
You may also change the default email message format. If you prefer to send email in
HTML instead of plain text format, add the following line to config/environment.rb as
well:
ActionMailer::Base.default_content_type = "text/html"
Generate a mailer:
Use the following command to generate a mailer as follows:
C:\ruby\> cd emails
C:\ruby\emails> ruby script/generate mailer Emailer
This will create a file emailer.rb in app\models directory. Check the content of this file is
as follows:
The contact method has four parameters a recipient, subject, message and a sent_at,
which defines when the e-mail is sent. The method also defines six standard parameters
that are a part of every ActionMailer method:
• @subject defines the e-mail subject.
• @body is a Ruby hash that contains values with which you can populate the mail
template. You created three key-value pairs: title, email, and message
• @recipients is a list of the people to whom the message is being sent.
• @from defines who the e-mail is from.
• @sent_on takes the sent_at parameter and sets the timestamp of the e-mail.
• @headers is another hash that enables you to modify the e-mail headers. For
example, you can set the MIME type of the e-mail if you want to send either plain
text or HTML e-mail.
Now we will create a mailer template which is just text with standard Rails <%= %>
placeholders scattered throughout.
Hi!
You are having one email message from <%= @email %> with a tilte
Thanks
Now lets define a controller method in emailer_controller.rb which will call Model
method to send actual email as follows:
To deliver e-mail using the mailer's contact method, you have to add deliver_ to the
beginning of the method name. You add a return if request.xhr? so that you can escape to
Rails Java Script (RJS) if the browser does not support JavaScript and then tell the
method to render a text message.
You are almost done except to prepare a screen from where you will get user information
to send email. So lets define one screen method index in controller and corresponding
view:
def index
render :file => 'app\views\emailer\index.rhtml'
end
<h1>Send Email</h1>
<%= start_form_tag :action => 'sendmail' %>
<p><label for="email_subject">Subject</label>:
<%= text_field 'email', 'subject' %></p>
<p><label for="email_recipient">Recipient</label>:
<%= text_field 'email', 'recipient' %></p>
<p><label for="email_message">Message</label><br/>
<%= text_area 'email', 'message' %></p>
<%= submit_tag "Send" %>
<%= end_form_tag %>
For more information on how to send email using Rails, look at ActionMailer.