Docstoc

Sessions

Document Sample
Sessions Powered By Docstoc
					Sessions

      Carol Wolf
Computer Science
HTTP – Hypertext Transfer Protocol
Protocol may refer to: (from Wikipedia)
 Protocol (diplomacy), the etiquette of diplomacy and affairs of state
 Protocol (politics), a formal agreement between nation states
 Protocol, a.k.a. etiquette
 Clinical protocol, a.k.a. guideline (medical)
 Research methods:
       Protocol (natural sciences)
       Clinical trial protocol
   Voice procedure a protocol for voice communications
   Protocol (object-oriented programming), a common means for unrelated
    objects to communicate with each other
   Communications protocol, in telecommunications and computer
    networking
   Protocol (band), British
   Protocol (film), a 1984 comedy film
   Protocol (album), the début album/EP from Simon Phillips
HTTP
   A single web transaction consists of a request, service and response.
   Once the transaction is finished, the server does not retain any
    memory of it.
   A standard solution is to store some information about the
    transaction in a cookie on the user’s computer.
   This is usually an id. It is important that no two users get assigned
    the same id.
   Web sites with heavy traffic can use GUIDs. A GUID is a Global Unique IDentifier. Generally,
    a GUID consists of a random number created using the time on the computer in
    nanoseconds and some feature of the server. In the past this was the network card MAC
    (Media Access Control) address. But after the Melissa worm used this to infect computers
    world-wide, Microsoft changed the GUID algorithm. The string, 3F2504E0 4f89 11D3 9A 0C
    03 05 E8 2C 33 01, is an example of a GUID. The numbers are in hexadecimal.
   This id is then stored in the session on the server. When a user
    returns, the id is obtained from the cookie in order to find the
    appropriate user (and usually the user’s cart).
The Rails Session
   Web application frameworks all come with sessions.
   In Rails, the information in the session is stored in a hash.
   The size limit is 4K, so usually only an id is stored.
   And the id is most often a shopping cart id.
   The following example will be a student registration
    example.
   Given a list of courses, a student can choose the courses
    he/she wishes to take and collect them in a cart.
   When done the student would have to log into his/her
    university account.
The index page
Files generated
   Generate the courses table
    rails generate scaffold course number:string name:string credits:integer
   Generate the carts table. Carts are only needed for their ids.
    rails generate scaffold cart
   Generate the choices table
    rails generate scaffold choice cart_id:integer course_id:integer
   Create the tables with
       rake db:migrate
   Add some courses to the courses table to use as examples.
The cart
   The cart id will be stored in the session and then used by the choices table.
   This is done in the application controller.

    class ApplicationController < ActionController::Base
      protect_from_forgery

     private
     def current_cart
          Cart.find(session[:cart_id]) #See if a cart already exists.
          rescue ActiveRecord::RecordNotFound #If not, create a new one.
              cart = Cart.create
              session[:cart_id] = cart.id #Store the cart id in the session hash.
              cart # return the cart
          end
     end
The choices table
   The choices table is used to connect the student (via the
    cart) to the courses.
   Connections are made using belongs_to.
     class Choice < ActiveRecord::Base #In the model folder
          belongs_to :course
          belongs_to :cart

           #The credits method is used to return the credits for the chosen course.
           def credits
                course.credits
           end
     end
   On course can be chosen by many students.
   All operations on the model (table) will be ordered by
    number.
    class Course < ActiveRecord::Base
      default_scope :order => 'number'
      has_many :choices

     validates :number, :name, :credits, :presence => true
     validates :credits, :numericality => {:greater_than_or_equal_to => 1}
     validates :number, :uniqueness => true
    end
The Cart class
class Cart < ActiveRecord::Base
   has_many :choices, :dependent => :destroy

  def add_course(course_id)
   current_choice = choices.where(:course_id => course_id).first
    #If the course has not been chosen already, create a new choice.
   if current_choice == nil
         current_choice = Choice.new(:course_id => course_id)
         choices << current_choice # Append the new choice to choices.
   end
   current_choice #return value
  end

  def total_credits #Used to add up the credits chosen so far.
    choices.to_a.sum { |list| list.credits} #to_a makes an array of the choices.
  end
end
The cart class
   The cart class connects to the choices table.
   When the cart is emptied, all dependent records will also
    be removed.
   The cart class is used to add a course to the choices
    table. This requires both the cart id (representing the
    student) and the course id.
   If the cart_id/course_id combination is not in the choices
    table, the new record is added. If it is, nothing is done. In
    either case, the record is returned.
   The total_credits method is used to keep track of the
    number of credits already in the cart.
View to change
Change the list_courses view
<% @courses.each do |course| %>
  <tr>
    <td><%= course.number %></td>
    <td><%= course.name %></td>
    <td><%= course.credits %></td>
    <td><%= button_to "Add Course to Schedule",
           choices_path(:course_id => course.id) %>
  </tr>
<% end %>
   Add the button to the table. This sends the id of the
    chosen course to the choices controller.
Choices controller – create method
def create
  @cart = current_cart # found in application controller
  course = Course.find(params[:course_id])
  current_choice = Choice.find_by_course_id(course.id)

  if current_choice == nil # This is a new addition.
     @choice = @cart.add_course(course.id)
     respond_to do |format|
         if @choice.save
              format.html { redirect_to(@choice.cart,
                           :notice => 'Course was successfully added.') }
         else
              format.html { render :action => "new" }
         end
     end
Choices controller – create method (more)
  else
    @choice = current_choice
    respond_to do |format|
        format.html {redirect_to(@choice.cart,
                     :notice => 'Course was a duplicate and not added.') }
    end
  end
end
Choices controller – create method
   First the method gets the current cart’s id from the
    session using the application controller.
   It then uses the id it received from the web page
    parameters to find the course in the choices table.
   If this course, the current_choice, has not yet been added
    to the table, it now is and a notice is flashed to the user.
   If it is already in the cart, no changes are made and a
    notice to this effect is flashed back.
   In either case, control is redirected to the show web page
    in the views/carts folder.
Show web page in views/carts folder
<p id="notice"><%= notice %></p>
<table>
    <% for item in @cart.choices %>
         <tr>
             <td><%= item.course.number %> </td>
             <td><%= item.course.name %></td>
             <td><%= item.course.credits %></td>
         </tr>
    <% end %>
    <tr>
         <td colspan="2">Total Credits</td>
         <td><%= @cart.total_credits %></td>
    </tr>
</table>
Show web page in views/carts folder
    # Add a button to empty the cart (and start over).
    <p><%= button_to "Empty Cart", @cart,
              :method => :delete, :confirm => 'Are you sure?' %></p>
    # Link back to the main page.
    <p><%= link_to 'Back', schedule_index_path %></p>


   The show method will show the cart and allow a student
    to empty it and start over, if desired.
Two versions of the show web page
Emptying the cart – in views/carts
Change one line in the delete method for the cart.

  def destroy
        @cart = Cart.find(params[:id])
        @cart.destroy

        respond_to do |format|
                format.html { redirect_to(schedule_index_url) }
                format.xml { head :ok }
        end
  end

				
DOCUMENT INFO
Shared By:
Categories:
Tags:
Stats:
views:4
posted:6/25/2012
language:English
pages:20