SlideShare a Scribd company logo
The 12th Round of ROR Lab.



Action Controller
    Overview

        May 12th, 2012

        Hyoseong Choi
          ROR Lab.
A Controller

• RESTful applications
• like an orchestra conductor
• as a middle man btw models and views


                                    ROR Lab.
A Controller

• RESTful applications
• like an orchestra conductor
• as a middle man btw models and views


                                    ROR Lab.
A Controller

• RESTful applications
• like an orchestra conductor
• as a middle man btw models and views


                                    ROR Lab.
Methods & Actions
• A “class” has methods
• A controller < ApplicationController
• public methods => “action” <= routing



                                     ROR Lab.
Parameters
• Two kinds of parameters
 - Query string
 - Post data
• by params hash
• “Routing” parameters

                            ROR Lab.
Parameters
• default_url_options


  class PostsController < ApplicationController
    # The options parameter is the hash passed in to 'url_for'
    def default_url_options(options)
      {:locale => I18n.locale}
    end
  end



                                                                 ROR Lab.
Session
           stateless => stateful

   ActionDispatch::Session::CookieStore
• ActiveRecord::SessionStore
• ActionDispatch::Session::CacheStore
• ActionDispatch::Session::MemCacheStore


                                     ROR Lab.
Session
                  Accessing the Session


       class LoginsController < ApplicationController
  # "Create" a login, aka "log the user in"
  def create
    if user = User.authenticate(params[:username], params[:password])
      # Save the user ID in the session so it can be used in
      # subsequent requests
      session[:current_user_id] = user.id
      redirect_to root_url
    end
  end
end




                                                                        ROR Lab.
Session
               Removing a Session Key


      class LoginsController < ApplicationController
  # "Delete" a login, aka "log the user out"
  def destroy
    # Remove the user id from the session
    @_current_user = session[:current_user_id] = nil
    redirect_to root_url
  end
end




                                                       ROR Lab.
Session
                  Flash


• cleared with each request
• only available in the next request
• useful for storing error messages etc

                                          ROR Lab.
Session
                                Flash




redirect_to root_url, :notice => "You have successfully logged out"




                                                                      ROR Lab.
Session
 Flash




          ROR Lab.
Session
                               Flash
                          flash.keep

class MainController < ApplicationController
  # Let's say this action corresponds to root_url, but you want
  # all requests here to be redirected to UsersController#index.
  # If an action sets the flash and redirects here, the values
  # would normally be lost when another redirect happens, but you
  # can use 'keep' to make it persist for another request.
  def index
    # Will persist all flash values.
    flash.keep
 
    # You can also use a key to keep only some kind of value.
    # flash.keep(:notice)
    redirect_to users_url
  end
end




                                                                    ROR Lab.
Session
                                Flash
                             flash.now

class ClientsController < ApplicationController
  def create
    @client = Client.new(params[:client])
    if @client.save
      # ...
    else
      flash.now[:error] = "Could not save client"
      render :action => "new"
    end
  end
end




                                                   ROR Lab.
Cookies
•   persisted across request and even sessions

      class CommentsController < ApplicationController
        def new
          # Auto-fill the commenter's name if it has been stored in a cookie
          @comment = Comment.new(:name => cookies[:commenter_name])
        end
       
        def create
          @comment = Comment.new(params[:comment])
          if @comment.save
            flash[:notice] = "Thanks for your comment!"
            if params[:remember_name]
              # Remember the commenter's name.
              cookies[:commenter_name] = @comment.name
            else
              # Delete cookie for the commenter's name cookie, if any.
              cookies.delete(:commenter_name)
            end
            redirect_to @comment.article
          else
            render :action => "new"
          end
        end
      end




                                                                              ROR Lab.
Cookies
•   to delete a cookie value



                  cookies.delete(:key)




                                         ROR Lab.
xml & json data

class UsersController < ApplicationController
  def index
    @users = User.all
    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @users}
      format.json { render :json => @users}
    end
  end
end




                                                ROR Lab.
Filters

before    Action    after



           around




                            ROR Lab.
Filters
class ApplicationController < ActionController::Base
  before_filter :require_login
 
  private
 
  def require_login
    unless logged_in?
      flash[:error] = "You must be logged in to access this section"
      redirect_to new_login_url # halts request cycle
    end
  end
 
  # The logged_in? method simply returns true if the user is logged
  # in and false otherwise. It does this by "booleanizing" the
  # current_user method we created previously using a double ! operator.
  # Note that this is not common in Ruby and is discouraged unless you
  # really mean to convert something into true or false.
  def logged_in?
    !!current_user
  end
end




                                                                           ROR Lab.
Filters
• skip_before_filter
 class LoginsController < ApplicationController
   skip_before_filter :require_login, :only => [:new, :create]
 end




                                                                ROR Lab.
Filters
• around_filter
 class ChangesController < ActionController::Base
   around_filter :wrap_in_transaction, :only => :show
  
   private
  
   def wrap_in_transaction
     ActiveRecord::Base.transaction do
       begin
         yield
       ensure
         raise ActiveRecord::Rollback
       end
     end
   end
 end




                                                       ROR Lab.
Filters

• Three Ways to User Filters
 - a private method
 - a block
 - a class

                               ROR Lab.
Filters
• Using a Block in more simple cases
  class ApplicationController < ActionController::Base
    before_filter do |controller|
      redirect_to new_login_url unless controller.send(:logged_in?)
    end
  end




                                                                      ROR Lab.
Filters
• Using a Class in more complex cases
  class ApplicationController < ActionController::Base
    before_filter LoginFilter
  end
   
  class LoginFilter
    def self.filter(controller)
      unless controller.send(:logged_in?)
        controller.flash[:error] = "You must be logged in"
        controller.redirect_to controller.new_login_url
      end
    end
  end




                                                            ROR Lab.
CSRF

• Site to site hacking
• First step for this with non-GET request
  :create/update/destroy

• RESTful default to protect CSRF
• Nevertheless, non-GET request still
  vulnerable


                                         ROR Lab.
CSRF
•   To add a non-guessable token with form helpers

    <%= form_for @user do |f| %>
      <%= f.text_field :username %>
      <%= f.text_field :password %>
    <% end %>




    <form accept-charset="UTF-8" action="/users/1" method="post">
    <input type="hidden"
           value="67250ab105eb5ad10851c00a5621854a23af5489"
           name="authenticity_token"/>
    <!-- fields -->
    </form>




                                                                    ROR Lab.
CSRF
•   form_authenticity_token in custom Ajax calls

    <%= form_for @user do |f| %>
      <%= f.text_field :username %>
      <%= f.text_field :password %>
    <% end %>




    <form accept-charset="UTF-8" action="/users/1" method="post">
    <input type="hidden"
           value="67250ab105eb5ad10851c00a5621854a23af5489"
           name="authenticity_token"/>
    <!-- fields -->
    </form>




                                                                    ROR Lab.
Request & Response
     Objects

• Two methods in every controller
 - `request` method => request object
 - `response` method => response object

                                  ROR Lab.
Request Objects




              ROR Lab.
Request Objects

• Three hash parameters for request objects
 - path_parameters
 - query_parameters : query string
 - request_parameters : post data

                                      ROR Lab.
Response Objects




• like in an `after` filter
                             ROR Lab.
Response Objects




 response.headers["Content-Type"] = "application/pdf"




                                                        ROR Lab.
HTTP
Authentications




              ROR Lab.
HTTP
  Authentications
• Two types
 - Basic authentication
     : using base 64 encoding
 -   Digest authentication
     : using MD5 encoding


                                ROR Lab.
HTTP
  Authentications
• Basic authentication
   class AdminController < ApplicationController
     http_basic_authenticate_with :name => "humbaba", :password => "5baa61e4"
   end




                                                                                ROR Lab.
HTTP
  Authentications
• Digest authentication
   class AdminController < ApplicationController
     USERS = { "lifo" => "world" }
    
     before_filter :authenticate
    
     private
    
     def authenticate
       authenticate_or_request_with_http_digest do |username|
         USERS[username]
       end
     end




                                                                ROR Lab.
Streaming & File
   Downloads
 require "prawn"
 class ClientsController < ApplicationController
   # Generates a PDF document with information on the client and
   # returns it. The user will get the PDF as a file download.
   def download_pdf
     client = Client.find(params[:id])
     send_data generate_pdf(client),
               :filename => "#{client.name}.pdf",
               :type => "application/pdf",
               :disposition => "attachement"
   end
  
   private
  
   def generate_pdf(client)
     Prawn::Document.new do
       text client.name, :align => :center
       text "Address: #{client.address}"
       text "Email: #{client.email}"
     end.render
   end
 end




send_data                                                          ROR Lab.
Streaming & File
   Downloads
class ClientsController < ApplicationController
  # Stream a file that has already been generated and stored on disk.
  def download_pdf
    client = Client.find(params[:id])
    send_file("#{Rails.root}/files/clients/#{client.id}.pdf",
              :filename => "#{client.name}.pdf",
              :type => "application/pdf")
  end




send_file                                                               ROR Lab.
Streaming & File
                          Downloads
in a RESTful application


                            require "prawn"
                            class ClientsController < ApplicationController
                             
                              def show
                                @client = Client.find(params[:id])
                             
                                respond_to do |format|
                                  format.html
                                  format.pdf { render :pdf => generate_pdf(@client) }
                                end
                              end

                              private
                             
                              def generate_pdf(client)
                                Prawn::Document.new do
                                  text client.name, :align => :center
                                  text "Address: #{client.address}"
                                  text "Email: #{client.email}"
                                end.render
                              end
                            end




                           send_file                                                     ROR Lab.
Streaming & File
                          Downloads
                             • in config/initializer/mime_types.rb
in a RESTful application




                           send_file                            ROR Lab.
Parameter
        Filtering
• in config/application.rb
config.filter_parameters << :password




                                      ROR Lab.
Rescue
class ApplicationController < ActionController::Base
  rescue_from User::NotAuthorized, :with => :user_not_authorized
 
  private
 
  def user_not_authorized
    flash[:error] = "You don't have access to this section."
    redirect_to :back
  end
end
 
class ClientsController < ApplicationController
  # Check that the user has the right authorization to access clients.
  before_filter :check_authorization
 
  # Note how the actions don't have to worry about all the auth stuff.
  def edit
    @client = Client.find(params[:id])
  end
 
  private
 
  # If the user is not authorized, just throw the exception.
  def check_authorization
    raise User::NotAuthorized unless current_user.admin?
  end




                                                                         ROR Lab.
Force HTTPS
       protocol
class DinnerController
  force_ssl
end



class DinnerController
  force_ssl :only => :cheeseburger
  # or
  force_ssl :except => :cheeseburger
end




 # Force all access to the app over SSL, use Strict-Transport-Security, and use
secure cookies.
 config.force_ssl = true


                                                                                  ROR Lab.
감사합니다.

More Related Content

What's hot (18)

PPT
Testing Javascript with Jasmine
Tim Tyrrell
 
PDF
Painless JavaScript Testing with Jest
Michał Pierzchała
 
PDF
Advanced Jasmine - Front-End JavaScript Unit Testing
Lars Thorup
 
PPTX
Full Stack Unit Testing
GlobalLogic Ukraine
 
PPT
PHP Unit Testing
Tagged Social
 
PDF
Jasmine - why JS tests don't smell fishy
Igor Napierala
 
PPTX
Scaladays 2014 introduction to scalatest selenium dsl
Matthew Farwell
 
PDF
Web注入+http漏洞等描述
fangjiafu
 
PDF
Unit Testing Express and Koa Middleware in ES2015
Morris Singer
 
PDF
JAVASCRIPT Test Driven Development & Jasmine
Anup Singh
 
PDF
Tdd iPhone For Dummies
Giordano Scalzo
 
PDF
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
PDF
Testing Legacy Rails Apps
Rabble .
 
PDF
Laravel 5 Annotations: RESTful API routing
Christopher Pecoraro
 
PPTX
Clean tests good tests
Shopsys Framework
 
PDF
The Dark Art of Rails Plugins (2008)
lazyatom
 
PDF
Using Ruby on Rails with legacy Oracle databases
Raimonds Simanovskis
 
Testing Javascript with Jasmine
Tim Tyrrell
 
Painless JavaScript Testing with Jest
Michał Pierzchała
 
Advanced Jasmine - Front-End JavaScript Unit Testing
Lars Thorup
 
Full Stack Unit Testing
GlobalLogic Ukraine
 
PHP Unit Testing
Tagged Social
 
Jasmine - why JS tests don't smell fishy
Igor Napierala
 
Scaladays 2014 introduction to scalatest selenium dsl
Matthew Farwell
 
Web注入+http漏洞等描述
fangjiafu
 
Unit Testing Express and Koa Middleware in ES2015
Morris Singer
 
JAVASCRIPT Test Driven Development & Jasmine
Anup Singh
 
Tdd iPhone For Dummies
Giordano Scalzo
 
We Are All Testers Now: The Testing Pyramid and Front-End Development
All Things Open
 
Testing Legacy Rails Apps
Rabble .
 
Laravel 5 Annotations: RESTful API routing
Christopher Pecoraro
 
Clean tests good tests
Shopsys Framework
 
The Dark Art of Rails Plugins (2008)
lazyatom
 
Using Ruby on Rails with legacy Oracle databases
Raimonds Simanovskis
 

Viewers also liked (14)

PDF
Let's Learn Ruby - Basic
Eddie Kao
 
PPTX
Swift distributed tracing method and tools v2
zhang hua
 
PDF
Control review for iOS
William Price
 
PDF
September2011aftma
Jennifer Berkshire
 
PPT
Ruby on Rails testing with Rspec
Bunlong Van
 
PPT
jQuery For Beginners - jQuery Conference 2009
Ralph Whitbeck
 
PDF
Learning jQuery in 30 minutes
Simon Willison
 
PDF
A swift introduction to Swift
Giordano Scalzo
 
PPTX
Web application architecture
Tejaswini Deshpande
 
PPT
Introduction to html
vikasgaur31
 
PDF
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum
 
PPTX
Introduction to Web Architecture
Chamnap Chhorn
 
PDF
jQuery and Rails: Best Friends Forever
stephskardal
 
PDF
Swift Programming Language
Giuseppe Arici
 
Let's Learn Ruby - Basic
Eddie Kao
 
Swift distributed tracing method and tools v2
zhang hua
 
Control review for iOS
William Price
 
September2011aftma
Jennifer Berkshire
 
Ruby on Rails testing with Rspec
Bunlong Van
 
jQuery For Beginners - jQuery Conference 2009
Ralph Whitbeck
 
Learning jQuery in 30 minutes
Simon Willison
 
A swift introduction to Swift
Giordano Scalzo
 
Web application architecture
Tejaswini Deshpande
 
Introduction to html
vikasgaur31
 
Infinum iOS Talks #1 - Swift under the hood: Method Dispatching by Vlaho Poluta
Infinum
 
Introduction to Web Architecture
Chamnap Chhorn
 
jQuery and Rails: Best Friends Forever
stephskardal
 
Swift Programming Language
Giuseppe Arici
 
Ad

Similar to Action Controller Overview, Season 1 (20)

PDF
Action Controller Overview, Season 2
RORLAB
 
ODP
Security on Rails
David Paluy
 
PDF
Ruby on Rails Security Guide
ihji
 
PDF
Rails Security
Wen-Tien Chang
 
PDF
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
Hackito Ergo Sum
 
PDF
Rupicon 2014 Action pack
rupicon
 
PDF
Rails2 Pr
xibbar
 
KEY
Routing 1, Season 1
RORLAB
 
PDF
SOLID Ruby SOLID Rails
Michael Mahlberg
 
PDF
Ruby on-rails-security
Phong Nguyễn Đình
 
ZIP
Rails 3 (beta) Roundup
Wayne Carter
 
PDF
Rails 3 Beautiful Code
GreggPollack
 
KEY
Active Record Form Helpers, Season 1
RORLAB
 
KEY
Getting started with Rails (2), Season 2
RORLAB
 
PDF
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Nilesh Panchal
 
PDF
Rails Security
Jonathan Weiss
 
PDF
Ruby on Rails Security
Jonathan Weiss
 
PDF
Ruby on Rails Security
amiable_indian
 
PDF
Ruby On Rails Security 9984
Dr Rushi Raval
 
PDF
How to disassemble one monster app into an ecosystem of 30
fiyuer
 
Action Controller Overview, Season 2
RORLAB
 
Security on Rails
David Paluy
 
Ruby on Rails Security Guide
ihji
 
Rails Security
Wen-Tien Chang
 
HES2011 - joernchen - Ruby on Rails from a Code Auditor Perspective
Hackito Ergo Sum
 
Rupicon 2014 Action pack
rupicon
 
Rails2 Pr
xibbar
 
Routing 1, Season 1
RORLAB
 
SOLID Ruby SOLID Rails
Michael Mahlberg
 
Ruby on-rails-security
Phong Nguyễn Đình
 
Rails 3 (beta) Roundup
Wayne Carter
 
Rails 3 Beautiful Code
GreggPollack
 
Active Record Form Helpers, Season 1
RORLAB
 
Getting started with Rails (2), Season 2
RORLAB
 
Ruby on-rails-101-presentation-slides-for-a-five-day-introductory-course-1194...
Nilesh Panchal
 
Rails Security
Jonathan Weiss
 
Ruby on Rails Security
Jonathan Weiss
 
Ruby on Rails Security
amiable_indian
 
Ruby On Rails Security 9984
Dr Rushi Raval
 
How to disassemble one monster app into an ecosystem of 30
fiyuer
 
Ad

More from RORLAB (20)

PDF
Getting Started with Rails (4)
RORLAB
 
PDF
Getting Started with Rails (3)
RORLAB
 
PDF
Getting Started with Rails (2)
RORLAB
 
PDF
Getting Started with Rails (1)
RORLAB
 
PDF
Self join in active record association
RORLAB
 
PDF
Asset Pipeline in Ruby on Rails
RORLAB
 
PDF
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
RORLAB
 
PDF
Active Support Core Extension (3)
RORLAB
 
PDF
Active Support Core Extension (2)
RORLAB
 
PDF
Active Support Core Extensions (1)
RORLAB
 
PDF
Action View Form Helpers - 2, Season 2
RORLAB
 
PDF
Action View Form Helpers - 1, Season 2
RORLAB
 
PDF
Layouts and Rendering in Rails, Season 2
RORLAB
 
PDF
ActiveRecord Query Interface (2), Season 2
RORLAB
 
KEY
Active Record Query Interface (1), Season 2
RORLAB
 
KEY
Active Record Association (2), Season 2
RORLAB
 
KEY
ActiveRecord Association (1), Season 2
RORLAB
 
KEY
ActiveRecord Callbacks & Observers, Season 2
RORLAB
 
KEY
ActiveRecord Validations, Season 2
RORLAB
 
KEY
Rails Database Migration, Season 2
RORLAB
 
Getting Started with Rails (4)
RORLAB
 
Getting Started with Rails (3)
RORLAB
 
Getting Started with Rails (2)
RORLAB
 
Getting Started with Rails (1)
RORLAB
 
Self join in active record association
RORLAB
 
Asset Pipeline in Ruby on Rails
RORLAB
 
레일스가이드 한글번역 공개프로젝트 RORLabGuides 소개
RORLAB
 
Active Support Core Extension (3)
RORLAB
 
Active Support Core Extension (2)
RORLAB
 
Active Support Core Extensions (1)
RORLAB
 
Action View Form Helpers - 2, Season 2
RORLAB
 
Action View Form Helpers - 1, Season 2
RORLAB
 
Layouts and Rendering in Rails, Season 2
RORLAB
 
ActiveRecord Query Interface (2), Season 2
RORLAB
 
Active Record Query Interface (1), Season 2
RORLAB
 
Active Record Association (2), Season 2
RORLAB
 
ActiveRecord Association (1), Season 2
RORLAB
 
ActiveRecord Callbacks & Observers, Season 2
RORLAB
 
ActiveRecord Validations, Season 2
RORLAB
 
Rails Database Migration, Season 2
RORLAB
 

Recently uploaded (20)

PPTX
HYDROCEPHALUS: NURSING MANAGEMENT .pptx
PRADEEP ABOTHU
 
PPTX
Views on Education of Indian Thinkers J.Krishnamurthy..pptx
ShrutiMahanta1
 
PDF
DIGESTION OF CARBOHYDRATES,PROTEINS,LIPIDS
raviralanaresh2
 
PDF
People & Earth's Ecosystem -Lesson 2: People & Population
marvinnbustamante1
 
PPTX
ASRB NET 2023 PREVIOUS YEAR QUESTION PAPER GENETICS AND PLANT BREEDING BY SAT...
Krashi Coaching
 
PPTX
Views on Education of Indian Thinkers Mahatma Gandhi.pptx
ShrutiMahanta1
 
PPT
Talk on Critical Theory, Part II, Philosophy of Social Sciences
Soraj Hongladarom
 
PPT
Talk on Critical Theory, Part One, Philosophy of Social Sciences
Soraj Hongladarom
 
PDF
LAW OF CONTRACT (5 YEAR LLB & UNITARY LLB )- MODULE - 1.& 2 - LEARN THROUGH P...
APARNA T SHAIL KUMAR
 
PPTX
How to Manage Large Scrollbar in Odoo 18 POS
Celine George
 
PDF
CEREBRAL PALSY: NURSING MANAGEMENT .pdf
PRADEEP ABOTHU
 
PDF
BÀI TẬP BỔ TRỢ THEO LESSON TIẾNG ANH - I-LEARN SMART WORLD 7 - CẢ NĂM - CÓ ĐÁ...
Nguyen Thanh Tu Collection
 
PDF
ARAL_Orientation_Day-2-Sessions_ARAL-Readung ARAL-Mathematics ARAL-Sciencev2.pdf
JoelVilloso1
 
PPTX
How to Manage Promotions in Odoo 18 Sales
Celine George
 
PDF
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 - GLOBAL SUCCESS - CẢ NĂM - NĂM 2024 (VOCABULARY, ...
Nguyen Thanh Tu Collection
 
PPTX
How to Create Rental Orders in Odoo 18 Rental
Celine George
 
PPTX
How to Manage Access Rights & User Types in Odoo 18
Celine George
 
PPTX
How to Set Maximum Difference Odoo 18 POS
Celine George
 
PPTX
Capitol Doctoral Presentation -July 2025.pptx
CapitolTechU
 
PDF
ARAL-Orientation_Morning-Session_Day-11.pdf
JoelVilloso1
 
HYDROCEPHALUS: NURSING MANAGEMENT .pptx
PRADEEP ABOTHU
 
Views on Education of Indian Thinkers J.Krishnamurthy..pptx
ShrutiMahanta1
 
DIGESTION OF CARBOHYDRATES,PROTEINS,LIPIDS
raviralanaresh2
 
People & Earth's Ecosystem -Lesson 2: People & Population
marvinnbustamante1
 
ASRB NET 2023 PREVIOUS YEAR QUESTION PAPER GENETICS AND PLANT BREEDING BY SAT...
Krashi Coaching
 
Views on Education of Indian Thinkers Mahatma Gandhi.pptx
ShrutiMahanta1
 
Talk on Critical Theory, Part II, Philosophy of Social Sciences
Soraj Hongladarom
 
Talk on Critical Theory, Part One, Philosophy of Social Sciences
Soraj Hongladarom
 
LAW OF CONTRACT (5 YEAR LLB & UNITARY LLB )- MODULE - 1.& 2 - LEARN THROUGH P...
APARNA T SHAIL KUMAR
 
How to Manage Large Scrollbar in Odoo 18 POS
Celine George
 
CEREBRAL PALSY: NURSING MANAGEMENT .pdf
PRADEEP ABOTHU
 
BÀI TẬP BỔ TRỢ THEO LESSON TIẾNG ANH - I-LEARN SMART WORLD 7 - CẢ NĂM - CÓ ĐÁ...
Nguyen Thanh Tu Collection
 
ARAL_Orientation_Day-2-Sessions_ARAL-Readung ARAL-Mathematics ARAL-Sciencev2.pdf
JoelVilloso1
 
How to Manage Promotions in Odoo 18 Sales
Celine George
 
BÀI TẬP BỔ TRỢ TIẾNG ANH 8 - GLOBAL SUCCESS - CẢ NĂM - NĂM 2024 (VOCABULARY, ...
Nguyen Thanh Tu Collection
 
How to Create Rental Orders in Odoo 18 Rental
Celine George
 
How to Manage Access Rights & User Types in Odoo 18
Celine George
 
How to Set Maximum Difference Odoo 18 POS
Celine George
 
Capitol Doctoral Presentation -July 2025.pptx
CapitolTechU
 
ARAL-Orientation_Morning-Session_Day-11.pdf
JoelVilloso1
 

Action Controller Overview, Season 1

  • 1. The 12th Round of ROR Lab. Action Controller Overview May 12th, 2012 Hyoseong Choi ROR Lab.
  • 2. A Controller • RESTful applications • like an orchestra conductor • as a middle man btw models and views ROR Lab.
  • 3. A Controller • RESTful applications • like an orchestra conductor • as a middle man btw models and views ROR Lab.
  • 4. A Controller • RESTful applications • like an orchestra conductor • as a middle man btw models and views ROR Lab.
  • 5. Methods & Actions • A “class” has methods • A controller < ApplicationController • public methods => “action” <= routing ROR Lab.
  • 6. Parameters • Two kinds of parameters - Query string - Post data • by params hash • “Routing” parameters ROR Lab.
  • 7. Parameters • default_url_options class PostsController < ApplicationController   # The options parameter is the hash passed in to 'url_for'   def default_url_options(options)     {:locale => I18n.locale}   end end ROR Lab.
  • 8. Session stateless => stateful ActionDispatch::Session::CookieStore • ActiveRecord::SessionStore • ActionDispatch::Session::CacheStore • ActionDispatch::Session::MemCacheStore ROR Lab.
  • 9. Session Accessing the Session class LoginsController < ApplicationController   # "Create" a login, aka "log the user in"   def create     if user = User.authenticate(params[:username], params[:password])       # Save the user ID in the session so it can be used in       # subsequent requests       session[:current_user_id] = user.id       redirect_to root_url     end   end end ROR Lab.
  • 10. Session Removing a Session Key class LoginsController < ApplicationController   # "Delete" a login, aka "log the user out"   def destroy     # Remove the user id from the session     @_current_user = session[:current_user_id] = nil     redirect_to root_url   end end ROR Lab.
  • 11. Session Flash • cleared with each request • only available in the next request • useful for storing error messages etc ROR Lab.
  • 12. Session Flash redirect_to root_url, :notice => "You have successfully logged out" ROR Lab.
  • 13. Session Flash ROR Lab.
  • 14. Session Flash flash.keep class MainController < ApplicationController   # Let's say this action corresponds to root_url, but you want   # all requests here to be redirected to UsersController#index.   # If an action sets the flash and redirects here, the values   # would normally be lost when another redirect happens, but you   # can use 'keep' to make it persist for another request.   def index     # Will persist all flash values.     flash.keep       # You can also use a key to keep only some kind of value.     # flash.keep(:notice)     redirect_to users_url   end end ROR Lab.
  • 15. Session Flash flash.now class ClientsController < ApplicationController   def create     @client = Client.new(params[:client])     if @client.save       # ...     else       flash.now[:error] = "Could not save client"       render :action => "new"     end   end end ROR Lab.
  • 16. Cookies • persisted across request and even sessions class CommentsController < ApplicationController   def new     # Auto-fill the commenter's name if it has been stored in a cookie     @comment = Comment.new(:name => cookies[:commenter_name])   end     def create     @comment = Comment.new(params[:comment])     if @comment.save       flash[:notice] = "Thanks for your comment!"       if params[:remember_name]         # Remember the commenter's name.         cookies[:commenter_name] = @comment.name       else         # Delete cookie for the commenter's name cookie, if any.         cookies.delete(:commenter_name)       end       redirect_to @comment.article     else       render :action => "new"     end   end end ROR Lab.
  • 17. Cookies • to delete a cookie value cookies.delete(:key) ROR Lab.
  • 18. xml & json data class UsersController < ApplicationController   def index     @users = User.all     respond_to do |format|       format.html # index.html.erb       format.xml  { render :xml => @users}       format.json { render :json => @users}     end   end end ROR Lab.
  • 19. Filters before Action after around ROR Lab.
  • 20. Filters class ApplicationController < ActionController::Base   before_filter :require_login     private     def require_login     unless logged_in?       flash[:error] = "You must be logged in to access this section"       redirect_to new_login_url # halts request cycle     end   end     # The logged_in? method simply returns true if the user is logged   # in and false otherwise. It does this by "booleanizing" the   # current_user method we created previously using a double ! operator.   # Note that this is not common in Ruby and is discouraged unless you   # really mean to convert something into true or false.   def logged_in?     !!current_user   end end ROR Lab.
  • 21. Filters • skip_before_filter class LoginsController < ApplicationController   skip_before_filter :require_login, :only => [:new, :create] end ROR Lab.
  • 22. Filters • around_filter class ChangesController < ActionController::Base   around_filter :wrap_in_transaction, :only => :show     private     def wrap_in_transaction     ActiveRecord::Base.transaction do       begin         yield       ensure         raise ActiveRecord::Rollback       end     end   end end ROR Lab.
  • 23. Filters • Three Ways to User Filters - a private method - a block - a class ROR Lab.
  • 24. Filters • Using a Block in more simple cases class ApplicationController < ActionController::Base   before_filter do |controller|     redirect_to new_login_url unless controller.send(:logged_in?)   end end ROR Lab.
  • 25. Filters • Using a Class in more complex cases class ApplicationController < ActionController::Base   before_filter LoginFilter end   class LoginFilter   def self.filter(controller)     unless controller.send(:logged_in?)       controller.flash[:error] = "You must be logged in"       controller.redirect_to controller.new_login_url     end   end end ROR Lab.
  • 26. CSRF • Site to site hacking • First step for this with non-GET request :create/update/destroy • RESTful default to protect CSRF • Nevertheless, non-GET request still vulnerable ROR Lab.
  • 27. CSRF • To add a non-guessable token with form helpers <%= form_for @user do |f| %>   <%= f.text_field :username %>   <%= f.text_field :password %> <% end %> <form accept-charset="UTF-8" action="/users/1" method="post"> <input type="hidden"        value="67250ab105eb5ad10851c00a5621854a23af5489"        name="authenticity_token"/> <!-- fields --> </form> ROR Lab.
  • 28. CSRF • form_authenticity_token in custom Ajax calls <%= form_for @user do |f| %>   <%= f.text_field :username %>   <%= f.text_field :password %> <% end %> <form accept-charset="UTF-8" action="/users/1" method="post"> <input type="hidden"        value="67250ab105eb5ad10851c00a5621854a23af5489"        name="authenticity_token"/> <!-- fields --> </form> ROR Lab.
  • 29. Request & Response Objects • Two methods in every controller - `request` method => request object - `response` method => response object ROR Lab.
  • 30. Request Objects ROR Lab.
  • 31. Request Objects • Three hash parameters for request objects - path_parameters - query_parameters : query string - request_parameters : post data ROR Lab.
  • 32. Response Objects • like in an `after` filter ROR Lab.
  • 35. HTTP Authentications • Two types - Basic authentication : using base 64 encoding - Digest authentication : using MD5 encoding ROR Lab.
  • 36. HTTP Authentications • Basic authentication class AdminController < ApplicationController   http_basic_authenticate_with :name => "humbaba", :password => "5baa61e4" end ROR Lab.
  • 37. HTTP Authentications • Digest authentication class AdminController < ApplicationController   USERS = { "lifo" => "world" }     before_filter :authenticate     private     def authenticate     authenticate_or_request_with_http_digest do |username|       USERS[username]     end   end ROR Lab.
  • 38. Streaming & File Downloads require "prawn" class ClientsController < ApplicationController   # Generates a PDF document with information on the client and   # returns it. The user will get the PDF as a file download.   def download_pdf     client = Client.find(params[:id])     send_data generate_pdf(client),               :filename => "#{client.name}.pdf",               :type => "application/pdf", :disposition => "attachement"   end     private     def generate_pdf(client)     Prawn::Document.new do       text client.name, :align => :center       text "Address: #{client.address}"       text "Email: #{client.email}"     end.render   end end send_data ROR Lab.
  • 39. Streaming & File Downloads class ClientsController < ApplicationController   # Stream a file that has already been generated and stored on disk.   def download_pdf     client = Client.find(params[:id])     send_file("#{Rails.root}/files/clients/#{client.id}.pdf",               :filename => "#{client.name}.pdf",               :type => "application/pdf")   end send_file ROR Lab.
  • 40. Streaming & File Downloads in a RESTful application require "prawn" class ClientsController < ApplicationController     def show     @client = Client.find(params[:id])       respond_to do |format|       format.html       format.pdf { render :pdf => generate_pdf(@client) }     end   end   private     def generate_pdf(client)     Prawn::Document.new do       text client.name, :align => :center       text "Address: #{client.address}"       text "Email: #{client.email}"     end.render   end end send_file ROR Lab.
  • 41. Streaming & File Downloads • in config/initializer/mime_types.rb in a RESTful application send_file ROR Lab.
  • 42. Parameter Filtering • in config/application.rb config.filter_parameters << :password ROR Lab.
  • 43. Rescue class ApplicationController < ActionController::Base   rescue_from User::NotAuthorized, :with => :user_not_authorized     private     def user_not_authorized     flash[:error] = "You don't have access to this section."     redirect_to :back   end end   class ClientsController < ApplicationController   # Check that the user has the right authorization to access clients.   before_filter :check_authorization     # Note how the actions don't have to worry about all the auth stuff.   def edit     @client = Client.find(params[:id])   end     private     # If the user is not authorized, just throw the exception.   def check_authorization     raise User::NotAuthorized unless current_user.admin?   end ROR Lab.
  • 44. Force HTTPS protocol class DinnerController   force_ssl end class DinnerController   force_ssl :only => :cheeseburger   # or   force_ssl :except => :cheeseburger end # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = true ROR Lab.
  • 46.   ROR Lab.

Editor's Notes