CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...
-
date post
12-Sep-2014 -
Category
Documents
-
view
4.922 -
download
0
description
Transcript of CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...
![Page 1: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/1.jpg)
CS 683 Emerging TechnologiesFall Semester, 2006
Doc 22 Rails 6 URLS, Forms, AJAXNov 9, 2006
Copyright ©, All rights reserved. 2006 SDSU & Roger Whitney, 5500 Campanile Drive, San Diego, CA 92182-7700 USA. OpenContent (http://www.opencontent.org/opl.shtml) license defines the copyright on this document.
![Page 2: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/2.jpg)
References
2
Agile Web Development with Rails 2nd Ed Bl.16 October 25, Thomas & Hanson, The Pragmatic Bookshelf, PDF
Rails API, http://api.rubyonrails.org/
![Page 3: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/3.jpg)
3
Url Mapping
![Page 4: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/4.jpg)
4
config/routes.rbContains mapping Rules
ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl'
map.connect ':controller/:action/:id'end
First matching rules applies
:controller => which controller to call:action => which method to call in controller:id => value in params
![Page 5: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/5.jpg)
Default Example
5
Request: http://127.0.0.1:3000/books/list/
:controller = books:action = list:id not defined
Request: http://127.0.0.1:3000/books/list/a
:controller = books:action = list:id = a
Request: http://127.0.0.1:3000/books/list/a/b
No matching rule
rule: map.connect ':controller/:action/:id'
![Page 6: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/6.jpg)
New Rule
6
map.connect 'store/index.html', :controller => 'books', :action => 'list'
http://127.0.0.1:3000/store/index.html
calls list method in BooksController
![Page 7: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/7.jpg)
Does not work
7
map.connect 'index.html', :controller => 'books', :action => 'list'
http://127.0.0.1:3000/index.html results in Rails Welcome page
How do we turn this off?
![Page 8: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/8.jpg)
Default Values
8
map.connect 'cat/:a/:b/:c', :controller => 'foo', :action => 'bar', :a => 'at', :b => 'bat', :c => 'cat'
class FooController < ActionController::Base def bar puts 'made it' a = @params[:a] b = @params[:b] c = @params[:c] render :text => "a = #{a}<br/>b = #{b}<br/>c = #{c}" end
![Page 9: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/9.jpg)
Extra text in URL
9
map.connect 'store/:controller/buy/:id', :action => 'buy'
http://0.0.0.0:3000/store/computer/buy/xbox
@param = {:controller => 'computer', :id => 'xbox'
![Page 10: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/10.jpg)
Specifying Formats
10
map.connect 'whitney/:year/:month/:day', :controller => 'blog', :action => "show_date", :requirements => { :year => /(19|20)\d\d/, :month => /[01]?\d/, :day => /[0-3]?\d/}, :day => nil http://0.0.0.0:3000/whitney/2005/01/30
@param = {:controller => 'blog', :action => 'show_date', :year => '2005', :month => '01', :day => '30'}
![Page 11: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/11.jpg)
map.connect ':controller/:action/:id'
11
Is it a good idea to let end users call methods directly?
![Page 12: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/12.jpg)
12
Forms
![Page 13: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/13.jpg)
13
Forms on Models
class CreateBooks < ActiveRecord::Migration def self.up create_table :books, :force => true do |t| t.column :title, :string t.column :author, :string t.column :date, :date end end
def self.down drop_table :books endend
migration file
![Page 14: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/14.jpg)
Controller
14
class BooksController < ApplicationController def sampleForm @book = Book.new if request.post? newBook = Book.new(params[:book]) if newBook.save #code to handle success else #code to handle failure end end
books_controller.rb
![Page 15: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/15.jpg)
Form
15
<% form_for :book do |form| %> Title: <%= form.text_field :title, :size => 30 %> <br/> Author: <%= form.text_field :author, :size => 30 %> <br/> Date: <%= form.date_select :date, :start_year => 1960 %> <br/> <%= submit_tag %><% end %>
Hidden assumption: instance variable name = class name
views/books/sampleForm.rhtml
![Page 16: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/16.jpg)
Explicit Variable Name
16
class BooksController < ApplicationController def sampleForm @foo = Book.new end
<% form_for :book, @foo do |form| %> Title: <%= form.text_field :title, :size => 30 %> <br/> Author: <%= form.text_field :author, :size => 30 %> <br/> Date: <%= form.date_select :date, :start_year => 1960 %> <br/> <%= submit_tag %><% end %>
![Page 17: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/17.jpg)
Specifying post method
17
<% form_for :book, @foo, :url => {:action => :create } do |form| %> Title: <%= form.text_field :title, :size => 30 %> <br/> Author: <%= form.text_field :author, :size => 30 %> <br/> Date: <%= form.date_select :date, :start_year => 1960 %> <br/> <%= submit_tag %><% end %>
![Page 18: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/18.jpg)
Some Form Helpers
18
• check_box • file_field • hidden_field • password_field • radio_button • text_area • text_field
http://api.rubyonrails.com/classes/ActionView/Helpers/FormHelper.html
http://api.rubyonrails.com/classes/ActionView/Helpers/FormOptionsHelper.html
• collection_select • country_options_for_select • country_select • option_groups_from_collection_for_select • options_for_select • options_from_collection_for_select • select • time_zone_options_for_select • time_zone_select
http://api.rubyonrails.com/classes/ActionView/Helpers/DateHelper.html
![Page 19: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/19.jpg)
Multiple Models in one Form
19
create_table :publishers do |t| t.column :name, :string
Publishers Table
create_table :books, :force => true do |t| t.column :title, :string t.column :author, :string t.column :date, :date t.column :publisher_id, integer
Books Table
![Page 20: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/20.jpg)
Controller
20
class BooksController < ApplicationController def sampleForm @foo = Book.new @publisher = Publisher.new if request.post? newBook = Book.new(params[:book]) publisher = Publisher.new(params[:publisher]) # code to handle post here end end
![Page 21: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/21.jpg)
sampleForm.rhtml
21
<% form_for :book, @foo do |form| %> Title: <%= form.text_field :title, :size => 30 %> <br/> Author: <%= form.text_field :author, :size => 30 %> <br/> Date: <%= form.date_select :date, :start_year => 1960 %> <br/>
<% fields_for :publisher do |pub| %> Publisher: <%= pub.text_field :name %><br/> <% end %>
<%= submit_tag %><% end %>
Of course one really does not want to create a new publisher with each book
![Page 22: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/22.jpg)
Showing the List
22
class BooksController < ApplicationController def sampleForm @foo = Book.new @publishers = Publisher.find(:all).collect {|p| [p.name, p.id]} if request.post? newBook = Book.new(params[:book]) if newBook.save puts 'saved' else puts 'not saved' end end end
![Page 23: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/23.jpg)
The Form
23
<% form_for :book, @foo do |form| %> Title: <%= form.text_field :title, :size => 30 %> <br/> Author: <%= form.text_field :author, :size => 30 %> <br/> Date: <%= form.date_select :date, :start_year => 1990 %> <br/> Publisher: <%= form.select :publisher_id, @publishers %> <br/> <%= submit_tag %><% end %>
http://api.rubyonrails.com/classes/ActionView/Helpers/FormOptionsHelper.html#M000399
![Page 24: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/24.jpg)
24
Ajax Intro
![Page 25: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/25.jpg)
25
Ajax & Web 2.0
AJAX - Asynchronous JavaScript and XML
Request a page
Return HTML
Render page
User Event
JavaScript callXMLHttpRequest
Return HTML fragment, script or
data
Do something withHTML fragment,
script data
Browser Server
HTTP GETor POST
HTTP GETor POST
![Page 26: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/26.jpg)
Some Web 2.0 sites
26
Google maps/local http://maps.google.com/
Housing Maps - Graiglist using Google maps, http://www.housingmaps.com/
flickr, photos & slide shows, http://www.flickr.com/
37 signals http://www.37signals.com/ Basecamp - project management, http://www.basecamphq.com/ Backpack - organize information, http://www.backpackit.com/ Writeboard - collaborative writing, http://www.writeboard.com/ Ta-da List - to-do lists, http://www.tadalist.com/
![Page 27: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/27.jpg)
Jakob Nielsen on Ajax
27
For new or inexperienced Web designers - Just say no to Ajax
Web pageUser's view of informationUnit of navigationTextual address used to retrieve informationUnit of information on server
Ajax Breaks this model of a web pageBack button does not workPrinting problemsAuthoring problemsSearch Problems
![Page 28: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/28.jpg)
First Example
28
class AjaxController < ApplicationController def time_now render :layout => false end def remoteLink endend
app/controllers/ajax_controller
![Page 29: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/29.jpg)
Views
29
app/views/layout/ajax.rhtml
<html><head> <title>Ajax Examples</title> <%= javascript_include_tag "prototype" %></head><body> <%= @content_for_layout %></body></html>
<%= link_to_remote( "Click on me", :update => 'changeDiv', :url => { :action => :time_now} )%><div id="changeDiv">Hi mom</div>
app/views/ajax/remoteLink.rhtml
Hello Ajax<p>The time is now <%= Time.now%></p><p>Session ID is <%= session.session_id %></p>
app/views/ajax/time_now.rhtml
![Page 30: CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...](https://reader036.fdocuments.us/reader036/viewer/2022082219/5412c0778d7f72314e8b46e3/html5/thumbnails/30.jpg)
Screen Shots
30