Contents 

Ruby on Rails: Up and Running
Table of Contents
Copyright
Preface
Chapter 1. Zero to Sixty: Introducing Rails
Section 1.1. Rails Strengths
Section 1.2. Putting Rails into Action
Section 1.3. Organization
Section 1.4. The Web Server
Section 1.5. Creating a Controller
Section 1.6. Building a View
Section 1.7. Tying the Controller to the View
Section 1.8. Under the Hood
Section 1.9. What's Next?
Chapter 2. Active Record Basics
Section 2.1. Active Record Basics
Section 2.2. Introducing Photo Share
Section 2.3. Schema Migrations
Section 2.4. Basic Active Record Classes
Section 2.5. Attributes
Section 2.6. Complex Classes
Section 2.7. Behavior
Section 2.8. Moving Forward
Chapter 3. Active Record Relationships
Section 3.1. belongs_to
Section 3.2. has_many
Section 3.3. has_one
Section 3.4. What You Haven't Seen
Section 3.5. Looking Ahead
Chapter 4. Scaffolding
Section 4.1. Using the Scaffold Method
Section 4.2. Replacing Scaffolding
Section 4.3. Generating Scaffolding Code
Section 4.4. Moving Forward
Chapter 5. Extending Views
Section 5.1. The Big Picture
Section 5.2. Seeing Real Photos
Section 5.3. View Templates
Section 5.4. Setting the Default Root
Section 5.5. Stylesheets
Section 5.6. Hierarchical Categories
Section 5.7. Styling the Slideshows
Chapter 6. Ajax
Section 6.1. How Rails Implements Ajax
Section 6.2. Playing a Slideshow
Section 6.3. Using Drag-and-Drop to Reorder Slides
Section 6.4. Drag and Drop Everything (Almost Everything)
Section 6.5. Filtering by Category
Chapter 7. Testing
Section 7.1. Background
Section 7.2. Ruby's Test::Unit
Section 7.3. Testing in Rails
Section 7.4. Wrapping Up
Appendix A. Installing Rails
Section 1.1. Windows
Section 2.1. OS X
Section 3.1. Linux
Appendix B. Quick Reference
Section 5.1. General
Section 5.2. Testing
Section 5.3. RJS (Ruby JavaScript)
Section 5.4. Active Record
Section 5.5. Controllers
Section 5.6. Views
Section 5.7. Ajax
Section 5.8. Configuring Your Application
About the Authors
Colophon
Index
A
B
C
D
E
F
G
H
I
J
L
M
N
O
P
R
S
T
U
V
W
X
Y
Z

Ruby on Rails for all.

Prev Page Next Page
Previous Page
Next Page

5.6. Views

5.6.1. View Templates

All view templates are stored in app/views /controllername. The extension determines what kind of template it is:



*.rhtml

Ruby HTML (using ERB)



*.rxml

Ruby XML (using Builder)



*.rjs

Ruby JavaScript

All instance variables of the controller are available to the view. In addition, the following special objects can be accessed:



headers

The headers of the outgoing response



request

The incoming request object



response

The outgoing response object



params

The parameter hash



session

The session hash



controller

The current controller

5.6.2. RHTML

RHTML is HTML mixed with Ruby, using tags. All of Ruby is available for programming:

<% %>   # executes the Ruby code
<%= %>  # executes the Ruby code and displays the result

<ul>
<% @products.each do |p| %>
  <li><%= h @p.name %></li>
<% end %>
</ul>

The output of anything in <%= %> tags is directly copied to the HTML output stream. To secure against HTML injection, use the h( ) function to HTML-escape the output. For example:

<%=h @user_entered_notes %>

5.6.3. RXML

Creates XML files:

xml.instruct!               # <?xml version="1.0" encoding="UTF-8"?>
xml.comment! "a comment"    # <!-- a comment -->
xml.feed "xmlns" => "http://www.w3.org/2005/Atom" do
  xml.title "My Atom Feed"
  xml.subtitle h(@feed.subtitle), "type" => 'html'
  xml.link url_for( :only_path => false,
                    :controller => 'feed',
                    :action => 'atom' )
  xml.updated @updated.iso8601
  xml.author do
    xml.name "Jens-Christian Fischer"
    xml.email "jcfischer@gmail.com"
  end
  @entries.each do |entry|
    xml.entry do
      xml.title entry.title
      xml.link "href" => url_for ( :only_path => false,
                                   :controller => 'entries',
                                   :action => 'show',
                                   :id => entry )
      xml.id entry.urn
      xml.updated entry.updated.iso8601
      xml.summary h(entry.summary)
    end
  end
end

Learn more: http://rubyforge.org/projects/builder/.

5.6.4. RJS

In addition to HTML and XML templates, Rails also understands JavaScript templates. They allow you to easily create complex alterations of the displayed page. You can manipulate a page element with the following methods:



select

Select a DOM element for further processing:

page.select('pattern') # selects an item on the page through a CSS pattern
                       # select('p'), select('p.welcome b')
page.select('div.header em').first.hide
page.select('#items li').eacj do |value|
  value.hide
end



insert_html

Inserts content into the DOM at a specific position:

page.insert_html :position, id, content

position can be one of the following:

:top
:bottom
:before
:after



replace_html

Replaces the inner HTML of the specified DOM element:

page.replace_html 'title', "This is the new title"
page.replace_html 'person-45', :partial => 'person', :object => @person



replace

Replaces the outer HTML (i.e., the entire element) of the specified DOM element:

page.replace 'task', :partial => 'task', :object => @task



remove

Removes the specified DOM element:

page.remove 'edit-button'



hide

Hides the specified DOM element:

page.hide 'some-element'



show

Shows the specified DOM element:

page.show 'some-element'



toggle

Toggles the visibility of a DOM element:

page.toggle 'some-element'



alert

Displays an alert box:

page.alert 'Hello world'



redirect_to

Redirects the browser to a given location:

page.redirect_to :controller => 'blog', :action => 'show', :id => @post



call

Calls another JavaScript function:

page.call foo, 1, 2



assign

Assigns a value to a JavaScript variable:

page.assign "foo", 42



<<

Writes raw JavaScript to the page:

page << "alert('hello world);"



delay

Delays the code in the block by a number of seconds:

page.delay(10) do
   page.visual_effect :fade, 'notice'
end



visual_effect

Calls a Scriptaculous effect:

page.visual_effect :highlight, 'notice', :duration => 2



sortable

Creates a sortable element:

page.sortable 'my_list', :url => { :action => 'order' }



dragable

Creates a draggable element:

page.dragable 'my_image', :revert => true



drop_receiving

Creates an element for receiving drops:

page.drop_recieving 'my_cart', :url => { :controller => 'cart',
                                         :action => 'add' }

Learn more: http://api.rubyonrails.com/classes/ActionView/Base.html.

5.6.5. Helpers

Small functions, normally used for displaying data, can be extracted to helpers. Each view has its own helper class (in app/helpers). Common functionality is stored in app/helpers/application_helper.rb.

5.6.6. Links

link_to "Name", :controller => 'post', :action => 'show', :id => @post.id
link_to "Delete", { :controller => "admin",
  :action => "delete",
  :id => @post },
{ :class => 'css-class',
  :id => 'css-id',
  :confirm => "Are you sure?" }

image_tag "spinner.png", :class => "image", :alt => "Spinner"

mail_to "info@invisible.ch", "send mail",
      :subject => "Support request by #{@user.name}",
        :cc => @user.email,
        :body => '....',
        :encoding => "javascript"

stylesheet_link_tag "scaffold", "admin", :media => "all"

Learn more: http://api.rubyonrails.com/classes/ActionView/Helpers/UrlHelper.html.

5.6.7. HTML Forms

5.6.7.1. Form
<%= form_tag { :action => :save }, { :method => :post } %>

This creates a form tag with the specified action, and makes it a POST request.

Use :multipart => true to define a MIME-multipart form (for file uploads).

5.6.7.2. Text Fields
<%= text_field :modelname, :attribute_name, options  %>

The following creates a text input field of the form:

<input type="text" name="modelname[attribute_name]" id="attributename" />

Example:

text_field "post", "title", "size" => 20
    <input  type="text" id="post_title" name="post[title]"
            size="20" value="#{@post.title}" />

Create a hidden field:

<%= hidden_field ... %>

Create a password field (all input shown as stars):

<%= password_field ... %>

Create a file field:

<%= file_field ... %>

5.6.7.3. Text Area
<%= text_area ... %>

This example:

text_area "post", "body", "cols" => 20, "rows" => 40

generates:

<textarea cols="20" rows="40" id="post_body" name="post[body]">
    #{@post.body}
</textarea>

5.6.7.4. Radio Button
<%= radio_button :modelname, :attribute, :tag_value, options %>

Example:

radio_button "post", "category", "rails"
radio_button "post", "category", "java"
    <input type="radio" id="post_category" name="post[category]" value="rails"
           checked="checked" />
    <input type="radio" id="post_category" name="post[category]" value="java" />

5.6.7.5. Checkbox
<%= check_box :modelname, :attribute, options, on_value, off_value %>

Example:

check_box "post", "validated"   # post.validated? returns 1 or 0
    <input type="checkbox" id="post_validate" name="post[validated]"
           value="1" checked="checked" />
    <input name="post[validated]" type="hidden" value="0" />

check_box "puppy", "gooddog", {}, "yes", "no"
    <input type="checkbox" id="puppy_gooddog" name="puppy[gooddog]" value="yes" />
    <input name="puppy[gooddog]" type="hidden" value="no" />

5.6.7.6. Options

Creates a select tag. Pass an array of choices:

<%= select :variable, :attribute, choices, options, 

html_options %>

Example:

select  "post",
        "person_id",
        Person.find_all.collect {|p| [ p.name, p.id ] },
        { :include_blank => true }

 <select name="post[person_id]">
   <option></option>
   <option value="1" selected="selected">David</option>
   <option value="2">Sam</option>
   <option value="3">Tobias</option>
 </select>

<%= collection_select :variable, :attribute, choices, :id, :value %>

5.6.7.7. Date and Time
<%= date_select :variable, :attribute, options %>
<%= datetime_select :variable, :attribute, options %>

Examples:

date_select "post", "written_on"
date_select "user", "birthday", :start_year => 1910
date_select "user", "cc_date", :start_year => 2005,
                               :use_month_numbers => true,
                               :discard_day => true,
                               :order => [:year, :month]

datetime_select "post", "written_on"

5.6.7.8. end_form Tag
<%= end_form_tag %>

Learn more: http://api.rubyonrails.com/classes/ActionView/Helpers/FormHelper.html.

5.6.8. Layouts

A layout defines the surroundings of an HTML page. You use it to define common look and feel. Layouts live in app/views/layouts :

<html>
  <head>
    <title>Form: <%= controller.action_name %></title>
    <%= stylesheet_link_tag 'scaffold' %>
  </head>
  <body>
    <%= yield %>   # the content will show up here
  </body>
</html>
----
class MyController < ApplicationController
  layout "standard", :except => [ :rss, :atom ]
...
end
----
class MyOtherController < ApplicationController
  layout :compute_layout

  # this method computes the name of the layout to use
  def compute_layout
    return "admin" if session[:role] == "admin"
    "standard"
  end
  ...
end

Layouts have access to the instance variables of the controller.

Learn more: http://api.rubyonrails.com/classes/ActionController/Layout/ClassMethods.html.

5.6.9. Partials

Partials are building blocks for creating views. They allow you to reuse commonly used display blocks. They are stored in files:

render :partial => 'product'

This command loads the partial in _product.rthml and passes the instance variable @product to it. The partial can access it using @product:

render :partial => 'product', :locals => { :product => @bought }

This command loads the same partial but assigns a different instance variable to it:

render :partial => 'product', :collection => @product_list

This renders the partial for each element in @product_list and assigns @product to each element. An iteration counter is automatically made available to the template with a name of the form partial_name_counter (in the previous example, product_counter).

Learn more: http://api.rubyonrails.com/classes/ActionView/Partials.html.


Previous Page
Next Page