Your SlideShare is downloading. ×
0
CS 683 Emerging Technologies
                  Fall Semester, 2006
           Doc 22 Rails 6 URLS, Forms, AJAX
           ...
References




Agile Web Development with Rails 2nd Ed Bl.16 October 25, Thomas & Hanson, The Pragmatic
Bookshelf, PDF

Ra...
Url Mapping




     3
config/routes.rb
                       Contains mapping Rules


First matching rules applies

:controller => which contro...
Default Example
                   rule: map.connect ':controller/:action/:id'


Request:     http://127.0.0.1:3000/books/...
New Rule
 map.connect 'store/index.html',
        :controller => 'books',
        :action => 'list'


http://127.0.0.1:300...
Does not work

map.connect 'index.html',
       :controller => 'books',
       :action => 'list'



 http://127.0.0.1:3000...
Default Values
map.connect 'cat/:a/:b/:c',
       :controller => 'foo',
       :action => 'bar',
       :a => 'at',
      ...
Extra text in URL

map.connect 'store/:controller/buy/:id',
   :action => 'buy'

http://0.0.0.0:3000/store/computer/buy/xb...
Specifying Formats

map.connect 'whitney/:year/:month/:day',
   :controller => 'blog',
   :action => "show_date",
   :requ...
map.connect ':controller/:action/:id'




Is it a good idea to let end users call methods directly?




                  ...
Forms




  12
Forms on Models
                migration file
class CreateBooks < ActiveRecord::Migration
 def self.up
   create_table :b...
Controller
             books_controller.rb

class BooksController < ApplicationController
 def sampleForm
   @book = Book...
Form
                  views/books/sampleForm.rhtml
<% form_for :book do |form| %>
    Title: <%= form.text_field :title, ...
Explicit Variable Name

class BooksController < ApplicationController
 def sampleForm
   @foo = Book.new
  end




 <% for...
Specifying post method




<% form_for :book, @foo, :url => {:action => :create } do |form| %>
    Title: <%= form.text_fi...
Some Form Helpers

      •    check_box           •   collection_select
      •    file_field          •   country_options...
Multiple Models in one Form

    Publishers Table                            Books Table
create_table :publishers do |t|  ...
Controller


class BooksController < ApplicationController
 def sampleForm
   @foo = Book.new
   @publisher = Publisher.ne...
sampleForm.rhtml
<% form_for :book, @foo do |form| %>
    Title: <%= form.text_field :title, :size => 30 %> <br/>
   Autho...
Showing the List
class BooksController < ApplicationController
 def sampleForm
   @foo = Book.new
   @publishers = Publish...
The Form
          <% form_for :book, @foo do |form| %>
              Title: <%= form.text_field :title, :size => 30 %> <b...
Ajax Intro




    24
Ajax & Web 2.0
AJAX - Asynchronous JavaScript and XML
                            Browser                      Server


  ...
Some Web 2.0 sites


Google maps/local http://maps.google.com/

Housing Maps - Graiglist using Google maps, http://
www.ho...
Jakob Nielsen on Ajax
For new or inexperienced Web designers -
Just say no to Ajax

                        Web page
User'...
First Example
        app/controllers/ajax_controller




class AjaxController < ApplicationController
   def time_now
   ...
Views
   app/views/layout/ajax.rhtml                      app/views/ajax/remoteLink.rhtml

<html>                         ...
Screen Shots




     30
Upcoming SlideShare
Loading in...5
×

CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ...

4,971

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
4,971
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
1
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Transcript of "CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails ..."

  1. 1. CS 683 Emerging Technologies Fall Semester, 2006 Doc 22 Rails 6 URLS, Forms, AJAX Nov 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.
  2. 2. References Agile Web Development with Rails 2nd Ed Bl.16 October 25, Thomas & Hanson, The Pragmatic Bookshelf, PDF Rails API, http://api.rubyonrails.org/ 2
  3. 3. Url Mapping 3
  4. 4. config/routes.rb Contains mapping Rules First matching rules applies :controller => which controller to call :action => which method to call in controller :id => value in params ActionController::Routing::Routes.draw do |map| map.connect ':controller/service.wsdl', :action => 'wsdl' map.connect ':controller/:action/:id' end 4
  5. 5. Default Example rule: map.connect ':controller/:action/:id' 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 5
  6. 6. New Rule map.connect 'store/index.html', :controller => 'books', :action => 'list' http://127.0.0.1:3000/store/index.html calls list method in BooksController 6
  7. 7. Does not work 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? 7
  8. 8. Default Values 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 8
  9. 9. Extra text in URL map.connect 'store/:controller/buy/:id', :action => 'buy' http://0.0.0.0:3000/store/computer/buy/xbox @param = {:controller => 'computer', :id => 'xbox' 9
  10. 10. Specifying Formats map.connect 'whitney/:year/:month/:day', :controller => 'blog', :action => "show_date", :requirements => { :year => /(19|20)dd/, :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'} 10
  11. 11. map.connect ':controller/:action/:id' Is it a good idea to let end users call methods directly? 11
  12. 12. Forms 12
  13. 13. Forms on Models migration file 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 end end 13
  14. 14. Controller books_controller.rb 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 14
  15. 15. Form views/books/sampleForm.rhtml <% 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 15
  16. 16. Explicit Variable Name 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 %> 16
  17. 17. Specifying post method <% 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 %> 17
  18. 18. Some Form Helpers • check_box • collection_select • file_field • country_options_for_select • hidden_field • country_select • password_field • option_groups_from_collection_for_select • radio_button • options_for_select • text_area • options_from_collection_for_select • text_field • select • time_zone_options_for_select • time_zone_select http://api.rubyonrails.com/classes/ActionView/Helpers/FormHelper.html http://api.rubyonrails.com/classes/ActionView/Helpers/FormOptionsHelper.html http://api.rubyonrails.com/classes/ActionView/Helpers/DateHelper.html 18
  19. 19. Multiple Models in one Form Publishers Table Books Table create_table :publishers do |t| create_table :books, :force => true do |t| t.column :name, :string t.column :title, :string t.column :author, :string t.column :date, :date t.column :publisher_id, integer 19
  20. 20. Controller 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 20
  21. 21. sampleForm.rhtml <% 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 21
  22. 22. Showing the List 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 22
  23. 23. The Form <% 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 23
  24. 24. Ajax Intro 24
  25. 25. Ajax & Web 2.0 AJAX - Asynchronous JavaScript and XML Browser Server Request a page HTTP GET or POST Return HTML Render page User Event JavaScript call XMLHttpRequest HTTP GET or POST Return HTML fragment, script or data Do something with HTML fragment, script data 25
  26. 26. Some Web 2.0 sites 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/ 26
  27. 27. Jakob Nielsen on Ajax For new or inexperienced Web designers - Just say no to Ajax Web page User's view of information Unit of navigation Textual address used to retrieve information Unit of information on server Ajax Breaks this model of a web page Back button does not work Printing problems Authoring problems Search Problems 27
  28. 28. First Example app/controllers/ajax_controller class AjaxController < ApplicationController def time_now render :layout => false end def remoteLink end end 28
  29. 29. Views app/views/layout/ajax.rhtml app/views/ajax/remoteLink.rhtml <html> <%= link_to_remote( "Click on me", <head> :update => 'changeDiv', <title>Ajax Examples</title> :url => { :action => :time_now} <%= javascript_include_tag "prototype" %> )%> </head> <div id="changeDiv">Hi mom</div> <body> <%= @content_for_layout %> </body> </html> app/views/ajax/time_now.rhtml Hello Ajax <p>The time is now <%= Time.now%> </p> <p>Session ID is <%= session.session_id %> </p> 29
  30. 30. Screen Shots 30
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×