rails - appalachian state universitycan/classes/5530/slides/rails.pdf · rails 1 rails web...

99
Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications for you applications come with lots of defaults which you can use as is or change as desired no XML required like in other frameworks follows Model-View-Controller Architecture

Upload: others

Post on 06-Jun-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 1

Rails● web application framework that uses Ruby as

its programming language● builds skeleton applications for you

– applications come with lots of defaults which you can use as is or change as desired

– no XML required like in other frameworks● follows Model-View-Controller Architecture

Page 2: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 2

Model-View-Controller Architecture

Browser Controller

Model

ActionView

User enters URL in Browser; server decodes the URL and sends request to controllerController passes request onto appropriate action which may interact with the modelView displays the result of the action

Page 3: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 3

The Controller ● Supervises the entire application, handling

requests as needed http://localhost:3000/hello/therehello controller decodes the URL to know that there

action is requestedController application would look like:class HelloController < ApplicationController def there endend

● ApplicationController inherits from ActionController::Base class

Page 4: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 4

The View● responsible for displaying the results of an

action● typically, action and model pass data onto the

view● views interact with the user and may display

text fields, text areas, check boxes, radio buttons, etc. When a submit button is clicked, data is passed to the controller which hands it to an action which passes it to a view

● views supported with the Rails ActionView module

Page 5: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 5

The Model● handles the data processing that takes place in

the web application – including number crunching and database accesses

● completely separate from the web application (independent of its use)

● typically, data passed to the model via the action which then retrieves the result

● support for the model code is provided by the Rails ActiveRecord module

Page 6: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 6

Documentation● enter the command: gem_server● use browser to open up page at:

http://localhost:8808

Page 7: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 7

Creating application framework● At Ruby console prompt type:rails applicationName● creates multiple directories and files● README file in the applicationName directory

contains a description of Rails and the directories that are created

Page 8: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 8

Application Directories● app - Holds all the code that's specific to this particular

application.● app/controllers - Holds controllers that should be

named like weblogs_controller.rb for automated URL mapping. All controllers should descend from ApplicationController which itself descends from ActionController::Base.

● app/models - Holds models that should be named like post.rb. Most models will descend from ActiveRecord::Base.

Page 9: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 9

Application Directories● app/views - Holds the template files for the view that

should be named like weblogs/index.rhtml for the WeblogsController#index action. All views use eRuby syntax.

● app/views/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.

Page 10: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 10

Application Directories● app/helpers - Holds view helpers that should be

named like weblogs_helper.rb. These are generated for you automatically when using script/generate for controllers. Helpers can be used to wrap functionality for your views into methods.

● config - Configuration files for the Rails environment, the routing map, the database, and other dependencies.

● components - Self-contained mini-applications that can bundle together controllers, models, and views.

Page 11: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 11

Application Directories● db - Contains the database schema in schema.rb.

db/migrate contains all the sequence of Migrations for your schema.

● doc - This directory is where your application documentation will be stored when generated using <tt>rake doc:app</tt>

● lib - Application specific libraries. Basically, any kind of custom code that doesn't belong under controllers, models, or helpers. This directory is in the load path.

Page 12: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 12

Application Directories● public- The directory available for the web server.

Contains subdirectories for images, stylesheets, and javascripts. Also contains the dispatchers and the default HTML files. This should be set as the DOCUMENT_ROOT of your web server.

● script - Helper scripts for automation and generation.● test - Unit and functional tests along with fixtures.

When using the script/generate scripts, template test files will be generated for you and placed in this directory.

Page 13: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 13

Application Directories● vendor - External libraries that the application depends

on. Also includes the plugins subdirectory. This directory is in the load path.

Page 14: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 14

To view application● Within applicationName directory at the Ruby

console prompt type:ruby script/server● This starts the WEBrick or Mongrel server that

comes with rails● To view the application home page, openhttp://localhost:3000/● Initially, this is just the default Rails page

available in public/index.html

Page 15: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 15

Page 16: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 16

Creating a controller● To create the controller (within new application

directory)ruby script/generate controller controllerName ● This creates three directories:

– app/controllers/controllerName_controller.rb– test/functional/controllerName_controller_test.rb– app/helpers/controllerName_helper.rb

Page 17: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 17

Example● Want to create a web application that prompts a

user for two numbers (in a view)● The two numbers will be summed together

using a model● The result is displayed in another view

Page 18: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 18

First create the application and controller

● create rails application called Addrails Add

● go into Add directory and create an Add controllercd Addruby script/generate controller Add

Page 19: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 19

Add an index and sum actions to my controller

class AddController < ApplicationController def index end def sum #form data is in the params hash (no matter whether #GET or POST is used), indexed by #symbol for name value in form @num1 = params[:num1].to_i @num2 = params[:num2].to_i #use the model @summer = Summer.new @result = @summer.sum(@num1, @num2) endend

This is in Add/app/controllers/add_controller.rb

Page 20: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 20

Create an index.rhtml view that is displayed in response to index

action

<html><head><title>Adding two numbers</title></head><body><% form_tag({:action => "sum"}, {:method => "post"}) do %>Please enter first number.<%= text_field_tag("num1", "", {"size" => 30}) %> <br />Please enter second number.<%= text_field_tag("num2", "", {"size" => 30}) %> <br /><%= submit_tag "submit" %><% end %></body></html>

This is in Add/app/views/add/index.rhtml

Page 21: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 21

Create a Summer model to do the sum

This is in Add/app/models/summer.rbclass Summer def sum(val1, val2) val1 + val2 endend

Page 22: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 22

Create a sum.rhtml that displays result

<html><head><title>Result of Sum</title></head><body><b>The sum of <%= @num1 %> and <%= @num2 %> is<%= @result %>.</b></body></html>

This is in Add/app/views/sum.rhtml

Page 23: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 23

Displaying the application● Start webrick or mongrel server (from within

Sum/app)ruby server/script

● Open up applicationhttp://localhost:3000/addThis executes the default action (index) and displays

the default page (index.rhtml)● Fill out form and click submit

This executes the sum action (which uses the model) and displays sum.rhtml

Page 24: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 24

● pages that end with a .rhtml extension can have Ruby code embedded within

● .rhtml pages are processed by an Embedded Ruby processor (ERb) which handles the ruby code and generates an HTML

● Ruby code must be contained within– <%= ... %> display result of the embedded ruby– <% ... %> don't display result– <%# %> comment

Embedded Ruby

Page 25: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 25

Embedded Ruby● puts <% puts “in foo function” %>

– can be used to output stuff to the console (where WEBrick is running)

– not for outputting to web page (even within <%= %>)

– useful for debugging● h <%= h(10 < 20) %>

– h method converts sensitive characters into HTML entity equivalents

Page 26: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 26

Rails Shortcuts● text_field_tag(name, value = nil, options = {})

– creates an input tag with:● type = “text”● name = name● default value displayed is value parameter● options is a hash where keys can be “disabled”, “size”,

and “maxlength”● Example:<%= text_field_tag("num1", "", {"size" => 30}) %>

Page 27: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 27

Rails Shortcuts● check_box_tag● select_tag● form_tag (deprecated start_form_tag,

end_form_tag)● submit_tag● radio_button_tagInfo about these and much more found at:http://api.rubyonrails.com/

Page 28: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 28

Invoking action from a form

<form action=”\Look\at” >● Pressing submit will cause

– at method within Look controller to be executed– then (by default) at.rhtml view to be displayed

Page 29: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 29

Reading data from form● data from form accessible via the params hash

(no matter whether get or post used)● access data by passing the symbol :namevalue

to the params hash● Example

– Form:<input type=”text” name=”addr” size=”50”>– Ruby@address = params[:addr]

Page 30: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 30

Selecting a view to render● By default, after at action is executed, at view is

displayed● render function can be used to display a

different view– from within actionrender(:action => :lunch)– this causes the view associated with the lunch

action to be displayed; it doesn't cause the lunch action to be executed

Page 31: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 31

Example● want an application that prompts for two

numbers and an operation (addition or subtraction)

● depending upon what operation is selected, an add or sub view is displayed

● First,rails Compute1ruby script/generate controller compute

Page 32: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 32

Compute controllerclass ComputeController < ApplicationController def index end def compute #form data is in the params hash (no matter whether #GET or POST is used), indexed by #symbol for name value in form @num1 = params[:num1].to_i @num2 = params[:num2].to_i @op = params[:op] if (@op == '+') @result = @num1 + @num2 render(:action => :add) else @result = @num1 - @num2 render(:action => :sub) end end def add end def sub endend

found in: Compute1/app/controllers/compute_controller.rb

Page 33: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 33

index.rhtml displayed in response to index action

<html><head><title>Adding two numbers</title></head><body><% form_tag({:action => "compute"}, {:method => "post"})do %>Please enter first number.<%= text_field_tag("num1", "", {"size" => 30}) %> <br />Please enter second number.<%= text_field_tag("num2", "", {"size" => 30}) %> <br />+<%= radio_button_tag("op", "+", true, {}) %> <br />-<%= radio_button_tag("op", "-", false, {}) %> <br /><%= submit_tag "submit" %> <% end %></body></html>

found in: Compute1/app/views/compute/index.rhtml

Page 34: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 34

add.rhtml and sub.rhtml<html><head> <title>Result of addition</title></head><body><b> <%= @num1 %> plus <%= @num2 %> is <%= @result %></b></body></html>

<html><head> <title>Result of subtraction</title></head><body><b> <%= @num1 %> minus <%= @num2 %> is <%= @result %></b></body></html>

found in: Compute1/app/views/compute/add.rhtml

found in: Compute1/app/views/compute/sub.rhtml

Page 35: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 35

Request of compute performs default index action and displays defaultindex.rhtml view

Page 36: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 36

Notice name of action is compute, not add

Page 37: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 37

redirect_to● render is used to display a view associated with

an action, but without causing the associated action to be executed

● unlike render, redirect_to displays a different view after first executing the associated action

● specifically, redirect_to causes browser to invoke a different URLrender(:action => :add) -- display add.rhtmlredirect_to(:action => :add) – execute add action and

then display add.rhtml

Page 38: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 38

Exampleclass ComputeController < ApplicationController def index end def compute @num1 = params[:num1] @num2 = params[:num2] @op = params[:op] if (@op == '+') #notice parameters to add action redirect_to(:action => :add, :num1 => @num1, :num2 => @num2) else redirect_to(:action => :sub, :num1 => @num1, :num2 => @num2) end end def add @num1 = params[:num1].to_i @num2 = params[:num2].to_i @result = @num1 + @num2 end def sub @num1 = params[:num1].to_i @num2 = params[:num2].to_i @result = @num1 - @num2 endend

Page 39: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 39

Page 40: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 40

Notice action is add, not compute

Page 41: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 41

Rendering any template ● can render any template, not just those

associated with an action● notice last example required add and sub

actions even though they weren't executed when rendering the view

● can render any template by using render with file key – key value is full path to the template

Page 42: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 42

Exampleclass ComputeController < ApplicationController def index end def compute #form data is in the params hash (no matter whether #GET or POST is used), indexed by #symbol for name value in form @num1 = params[:num1].to_i @num2 = params[:num2].to_i @op = params[:op] if (@op == '+') @result = @num1 + @num2 render(:file => 'C:\Users\Public\Downloads\InstantRails-1.7-win\InstantRails\rails_apps\Compute2\app\views\compute\add.rhtml') else @result = @num1 - @num2 render(:file => 'C:\Users\Public\Downloads\InstantRails-1.7-win\InstantRails\rails_apps\Compute2\app\views\compute\sub.rhtml') end endend

Notice there are no add and sub actions

Page 43: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 43

add.rhtml

<html><head> <title>Result of addition</title></head><body><b> <%= @num1 %> plus <%= @num2 %> is <%= @result %></b></body></html>

Exactly the same as in earlier example, but there is no actionassociated with it

Page 44: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 44

Page 45: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 45

Notice that the action is still compute even though a different view was displayed

Page 46: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 46

Linking to another action

● rails link_to method creates a hyperlink● clicking on link will causes the action to be

executed and the associated view to be displayed

<%= link_to “Go to lunch.”, :action => “lunch” %>clicking causes lunch action to occur and (unless

changed by action) lunch.rhtml template to be displayed

Page 47: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 47

Using a layout● Often we want the pages in a website to have a

common look● In rails we can capture the common look by

creating a layout● The layout can then display a specific view by

including the view's template● layouts are controller-specific

– layout for controller Look would be in the file Look/app/views/layouts/look.rhtml

Page 48: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 48

Example using link_to and a layout● Create the application

rails Poetry● Create the controller

ruby script/generate controller Poetry● Create a layout and place in the file:

Poetry/app/views/layouts/poetry.rhtml● Create templates for specific views: index.rhtml,

hope.rhtml, eclipse.rhtml● Controller has index, hope and eclipse actions

Page 49: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 49

My poetry.rhtml layout<html><head><title>Best Poetry</title><%= stylesheet_link_tag 'poetry.css' %></head><body><div id="heading"><%= @heading %></div><%= @content_for_layout %><% if controller.action_name != "index" %><%= link_to "Back To List", :action => "index" %><% end %></body></html>The value of @content_for_layout is a template...which templatedepends upon the action.

Page 50: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 50

Stylesheet poetry.cssbody {font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;font-size: 13px;line-height: 18px;background-color: #eee;}#heading {font-family: "Arial Rounded MT Bold";font-size: 20px;}

You can name the stylesheet anything you like, but itmust be in the directory: Poetry/public/stylesheets

Page 51: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 51

index.rhtml

<p><%= link_to "The Eclipse", :action => "eclipse" %><br /><%= link_to "Hope", :action => "hope" %></p>

Clicking on the link displayed will cause the action to be executed and the associated view to be displayed

Page 52: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 52

hope.rhtml<p>Hope is the thing with feathers<br />That perches in the soul,<br />And sings the tune without the words,<br />And never stops at all, <br /></p><p>Hope is the thing with feathers <br />That perches in the soul,<br />And sings the tune without the words,<br />And never stops at all, <br /></p><p>Hope is the thing with feathers<br />That perches in the soul,<br />And sings the tune without the words,<br />And never stops at all, <br /></p>

Page 53: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 53

eclipse.rhtml<p>I stood out in the open cold<br />To see the essence of the eclipse<br />Which was its perfect darkness. <br /></p><p>I stood in the cold on the porch<br />And could not think of anything so perfect<br />As mans hope of light in the face of darkness.<br /></p>

Page 54: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 54

poetry_controller.rb

class PoetryController < ApplicationController def index @heading = "My Favorite Poems" end def eclipse @heading = "The Eclipse, by Richard Eberhart" end def hope @heading = "Hope is the Thing, by Emily Dickinson" endend

Note that the @heading variable is referenced in the layout

Page 55: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 55

Page 56: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 56

Page 57: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 57

Working with multiple controllers● Often we want to break up our website into

separate parts that can be developed in isolation; for example: login utility, slide show builder, slide show displayer

● In Rails, we do this by creating multiple controllers

● We can execute the action of another controller by specifying both controller and actionredirect_to :controller => :categories, :action => :listlink_to 'List', {:controller => :categories, :action => :list}

Page 58: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 58

Sessions● Rails session is a hash that persists across

requests● session can be used to store any object (for

example, a shopping cart)● Rails causes a session id to be stored in a

cookie on the browser; actual session data is stored on the server

● After 15 minutes of inactivity, session data is erased

Page 59: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 59

Flash● flash is another hash that acts as a temporary

scratch pad for value● data can be stored in flash via the processing of

one request and is removed from flash at the end of handling the next request

● flash is very useful for displaying error messages or other comments

Page 60: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 60

Example with two controllers, a session and flash

● one controller handles logging in● second controller would allow the user to do

“stuff”● session used to make sure user doesn't bypass

logging in before doing stuff● flash used to display error message

Page 61: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 61

The steps● Create the Rails app

rails Session● Create the two controllers

ruby script/generate controller Loginruby script/generate controller Dostuff

Page 62: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 62

Login files● Sessions/app/controllers/login_controller.rb● Sessions/app/views/layouts/login.rhtml● Sessions/app/views/login/index.rhtml● Sessions/public/stylesheets/login.css

Page 63: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 63

login_controller.rbclass LoginController < ApplicationController def index @title = 'Login Page' end def login @password = params[:password] @email = params[:email] #Here is where you would verify the email address #and password (better than what I am doing) valid = true valid = false if @password == "" valid = false if @email == "" if (valid == true) session[:email] = @email redirect_to :controller => :dostuff, :action => :index else reset_session flash[:notice] = 'Invalid email address and password' redirect_to :action => :index end endend

Page 64: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 64

login.rhtml – the layout file

<html><head><title><%= @title %></title><%= stylesheet_link_tag 'login' %></head><body><%= @content_for_layout %><% if flash[:notice] %><div id="notice"><%= flash[:notice] %></div><% end %></body></html>

Page 65: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 65

login/index.rhtml

<% form_tag({ :action => "login"}, {:method => "post"})do %>Email Address:<%= text_field_tag("email", "", {"size" => 30}) %> <br />Password:<%= password_field_tag("password", "", {"size" => 30}) %> <br /><%= submit_tag "login" %><% end %>

Page 66: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 66

DoStuff files● Sessions/app/controllers/dostuff_controller.rb● Sessions/app/views/layouts/dostuff.rhtml● Sessions/app/views/dostuff/index.rhtml● Sessions/public/stylesheets/dostuff.css

Page 67: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 67

dostuff_controller.rb

class DostuffController < ApplicationController def index @title = 'Welcome User' if (!session[:email]) #user is not logged on redirect_to :controller=>:login, :action=>:index end endend

Page 68: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 68

dostuff.rhtml – the layout file

<html><head><title><%= @title %></title><%= stylesheet_link_tag 'dostuff' %></head><body><%= @content_for_layout %></body></html>

Page 69: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 69

dostuff/index.rhtml<%# index.rhtml for Dostuff controller %><p>You are logged on. Now you can do important stuff like<br />modify your blog, update your account info, or whatever<br />is appropriate for your application.</p>

Page 70: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 70

If the user tries to skip this page and instead open uphttp://localhost:3000/login, then the lack of a session willcause control to be sent back to this action.

Also, if the clicks on login without entering email or password,then control is sent back to this action.

Page 71: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 71

Page 72: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 72

Rails Scaffold utility● scaffold utility is used to build a framework for

database applications● scaffold generates the code necessary to

access and add to the database (rails automatically generates the mysql)

● scaffold also generated the interface that supports modifying the database or list the contents

Page 73: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 73

Simple store example● Create the application

rails Store● Create the database (table name needs to be

lower case and plural; also needs auto_increment id): CREATE TABLE `items` ( `id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY , `name` VARCHAR( 80 ) NOT NULL , `description` TEXT NOT NULL , `price` DECIMAL NOT NULL);

Page 74: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 74

Simple store example

modify the /Store/config/database.yml file, if necessary

development: adapter: mysql database: store username: root password: host: localhostIf you use the rake utility, you'll want three dbs: one for

development, one for testing and one for production● Next, we'll need to create a controller and a model, but first

...

Page 75: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 75

Naming the Model● database table name needs to be lowercase

and plural● mode name should be same except singular

and initial letter capped– database table: items– model: Item

● If database table name has underscores, model name should be equivalent camel case– database table: store_items– model: StoreItem

Page 76: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 76

Naming the Controller● can choose name you like● rails will create NameController class which

inherits from ApplicationController for a controller named Name

● scaffold utility will stock this controller with code

Page 77: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 77

Simple store example● Create the controller and the model

ruby script/generate scaffold Item Manage● Start up the server

ruby script/server● Open up browser and see what was created

http://localhost:3000/store

Page 78: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 78

Index action – db initially empty

Page 79: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 79

New action-- from New Itemlink on index

Page 80: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 80

List action (after new action)

Page 81: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 81

Show action

Page 82: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 82

Edit action

Page 83: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 83

Index action again – db not empty

Page 84: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 84

class ManageController < ApplicationController def index list render :action => 'list' end verify :method => :post, :only => [ :destroy, :create, :update ], :redirect_to => { :action => :list } def list @item_pages, @items = paginate :items, :per_page => 10 end def show @item = Item.find(params[:id]) end

def new @item = Item.new end

Manage Controller (next two slides)

Page 85: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 85

def create @item = Item.new(params[:item]) if @item.save flash[:notice] = 'Item was successfully created.' redirect_to :action => 'list' else render :action => 'new' end end

def edit @item = Item.find(params[:id]) end

def update @item = Item.find(params[:id]) if @item.update_attributes(params[:item]) flash[:notice] = 'Item was successfully updated.' redirect_to :action => 'show', :id => @item else render :action => 'edit' end end

def destroy Item.find(params[:id]).destroy redirect_to :action => 'list' endend

Page 86: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 86

About the controller code● verify method

– used to verify that certain conditions are met before action is attempted

– In this case for actions destroy, update, create, only the post method can be used to send data to the server; if verification fails, list action performed

● paginate method– returns a paginator object and the first page of

items to be displayed@item_pages, @items = paginate :items, :per_page => 10

Page 87: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 87

The layout - manage.rhtml<!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" xml:lang="en" lang="en"><head> <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> <title>Manage: <%= controller.action_name %></title> <%= stylesheet_link_tag 'scaffold' %></head><body><p style="color: green"><%= flash[:notice] %></p>

<%= yield %></body></html>

Page 88: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 88

About the layout● <%= yield %> does the same thing as <%=

@content_for_layout %>– causes the display of a particular view

Page 89: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 89

_form.html<%= error_messages_for 'item' %><!--[form:item]--><p><label for="item_name">Name</label><br/><%= text_field 'item', 'name' %></p><p><label for="item_description">Description</label><br/><%= text_area 'item', 'description' %></p><p><label for="item_price">Price</label><br/><%= text_field 'item', 'price' %></p><!--[eoform:item]-->

Page 90: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 90

about _form.rhtml● _form.rhtml is a chunk of a view● not associated with a particular action, they can

be rendered explicitly by another view or controller

● they can be passed parameters so that the results can be different with each rendering

Page 91: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 91

edit.rhtml

<h1>Editing item</h1><% form_tag :action => 'update', :id => @item do %> <%= render :partial => 'form' %> <%= submit_tag 'Edit' %><% end %><%= link_to 'Show', :action => 'show', :id => @item %> |<%= link_to 'Back', :action => 'list' %>

here is where the partial _form.rhtml gets rendered

Page 92: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 92

list.rhtml<h1>Listing items</h1>

<table> <tr> <% for column in Item.content_columns %> <th><%= column.human_name %></th> <% end %> </tr> <% for item in @items %> <tr> <% for column in Item.content_columns %> <td><%=h item.send(column.name) %></td> <% end %> <td><%= link_to 'Show', :action => 'show', :id => item %></td> <td><%= link_to 'Edit', :action => 'edit', :id => item %></td> <td><%= link_to 'Destroy', { :action => 'destroy', :id => item }, :confirm => 'Are you sure?', :method => :post %></td> </tr><% end %></table>

<%= link_to 'Previous page', { :page => @item_pages.current.previous } if @item_pages.current.previous %><%= link_to 'Next page', { :page => @item_pages.current.next } if @item_pages.current.next %>

<br />

<%= link_to 'New item', :action => 'new' %>

Page 93: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 93

About list.rhtml● Notice that @items is the array of items created

by the call to paginate● @item_pages is the paginator object that can

be used to display another page of items

Page 94: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 94

new.rhtml

<h1>New item</h1><% form_tag :action => 'create' do %> <%= render :partial => 'form' %> <%= submit_tag "Create" %><% end %><%= link_to 'Back', :action => 'list' %>

Page 95: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 95

show.rhtml<% for column in Item.content_columns %><p> <b><%= column.human_name %>:</b> <%=h @item.send(column.name) %></p><% end %><%= link_to 'Edit', :action => 'edit', :id => @item %> |<%= link_to 'Back', :action => 'list' %>

Page 96: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 96

About show.rhtml● uses model Item to get each cell of the selected

row● Item.content_columns returns the list of

columns (excluding the id column)● @item is the parameter to show.rhtml (see

show in controller class)● send method used to access the value of a

specific column

Page 97: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 97

Finally the model -- item.rbclass Item < ActiveRecord::Baseend

Where's the code for accessing the items table?It is inherited from the parent class ActiveRecord::Base

Page 98: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 98

Scaffold utility● Besides views, controller and model:

– stylesheet– testing frameworkwere also created

Page 99: Rails - Appalachian State Universitycan/classes/5530/Slides/Rails.pdf · Rails 1 Rails web application framework that uses Ruby as its programming language builds skeleton applications

Rails 99

What these slides don't cover● Lots, of course, but especially

– rake ● Ruby make utility● can be used to perform database migrations

– testing● Rails creates tests and test directories (unit tests for

models, functional tests for controllers and integration tests for multiple controls

– Rails and Ajax