Ruby on Rails | Screencasts | Download | Documentation | Weblog | Community | Source

Changeset 8543

Show
Ignore:
Timestamp:
01/03/08 15:49:59 (6 months ago)
Author:
david
Message:

Refactored ActionController::Verification and improved docs (closes #10681) [jamesh]

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack/lib/action_controller/verification.rb

    r8245 r8543  
    4444      # is a hash consisting of the following key/value pairs: 
    4545      # 
    46       # * <tt>:params</tt> - a single key or an array of keys that must 
    47       #   be in the <tt>params</tt> hash in order for the action(s) to be safely 
    48       #   called. 
    49       # * <tt>:session</tt> - a single key or an array of keys that must 
    50       #   be in the <tt>session</tt> in order for the action(s) to be safely called. 
    51       # * <tt>:flash</tt> - a single key or an array of keys that must 
    52       #   be in the flash in order for the action(s) to be safely called. 
    53       # * <tt>:method</tt> - a single key or an array of keys--any one of which 
    54       #   must match the current request method in order for the action(s) to 
    55       #   be safely called. (The key should be a symbol: <tt>:get</tt> or 
    56       #   <tt>:post</tt>, for example.) 
    57       # * <tt>:xhr</tt> - true/false option to ensure that the request is coming 
    58       #   from an Ajax call or not.  
    59       # * <tt>:add_flash</tt> - a hash of name/value pairs that should be merged 
    60       #   into the session's flash if the prerequisites cannot be satisfied. 
    61       # * <tt>:add_headers</tt> - a hash of name/value pairs that should be 
    62       #   merged into the response's headers hash if the prerequisites cannot 
    63       #   be satisfied. 
    64       # * <tt>:redirect_to</tt> - the redirection parameters to be used when 
    65       #   redirecting if the prerequisites cannot be satisfied. You can  
    66       #   redirect either to named route or to the action in some controller. 
    67       # * <tt>:render</tt> - the render parameters to be used when 
    68       #   the prerequisites cannot be satisfied. 
    69       # * <tt>:only</tt> - only apply this verification to the actions specified 
    70       #   in the associated array (may also be a single value). 
    71       # * <tt>:except</tt> - do not apply this verification to the actions 
    72       #   specified in the associated array (may also be a single value). 
     46      # <tt>:params</tt>::  
     47      #   a single key or an array of keys that must be in the <tt>params</tt>  
     48      #   hash in order for the action(s) to be safely called. 
     49      # <tt>:session</tt>::  
     50      #   a single key or an array of keys that must be in the <tt>session</tt>  
     51      #   in order for the action(s) to be safely called. 
     52      # <tt>:flash</tt>::  
     53      #   a single key or an array of keys that must be in the flash in order  
     54      #   for the action(s) to be safely called. 
     55      # <tt>:method</tt>::  
     56      #   a single key or an array of keys--any one of which must match the  
     57      #   current request method in order for the action(s) to be safely called.  
     58      #   (The key should be a symbol: <tt>:get</tt> or <tt>:post</tt>, for  
     59      #   example.) 
     60      # <tt>:xhr</tt>::  
     61      #   true/false option to ensure that the request is coming from an Ajax  
     62      #   call or not.  
     63      # <tt>:add_flash</tt>::  
     64      #   a hash of name/value pairs that should be merged into the session's  
     65      #   flash if the prerequisites cannot be satisfied. 
     66      # <tt>:add_headers</tt>::  
     67      #   a hash of name/value pairs that should be merged into the response's  
     68      #   headers hash if the prerequisites cannot be satisfied. 
     69      # <tt>:redirect_to</tt>::  
     70      #   the redirection parameters to be used when redirecting if the  
     71      #   prerequisites cannot be satisfied. You can redirect either to named  
     72      #   route or to the action in some controller. 
     73      # <tt>:render</tt>::  
     74      #   the render parameters to be used when the prerequisites cannot be satisfied. 
     75      # <tt>:only</tt>::  
     76      #   only apply this verification to the actions specified in the associated  
     77      #   array (may also be a single value). 
     78      # <tt>:except</tt>::  
     79      #   do not apply this verification to the actions specified in the associated  
     80      #   array (may also be a single value). 
    7381      def verify(options={}) 
    74         filter_opts = { :only => options[:only], :except => options[:except] } 
    75         before_filter(filter_opts) do |c| 
     82        before_filter :only => options[:only], :except => options[:except] do |c| 
    7683          c.send! :verify_action, options 
    7784        end 
     
    7986    end 
    8087 
     88  private 
     89 
    8190    def verify_action(options) #:nodoc: 
    82       prereqs_invalid = 
    83         [*options[:params] ].find { |v| params[v].nil?  } || 
    84         [*options[:session]].find { |v| session[v].nil? } || 
    85         [*options[:flash]  ].find { |v| flash[v].nil?   } 
    86        
    87       if !prereqs_invalid && options[:method] 
    88         prereqs_invalid ||=  
    89           [*options[:method]].all? { |v| request.method != v.to_sym } 
    90       end 
    91        
    92       prereqs_invalid ||= (request.xhr? != options[:xhr]) unless options[:xhr].nil? 
    93        
    94       if prereqs_invalid 
    95         flash.update(options[:add_flash]) if options[:add_flash] 
     91      if prereqs_invalid?(options) 
     92        flash.update(options[:add_flash])              if options[:add_flash] 
    9693        response.headers.update(options[:add_headers]) if options[:add_headers] 
    97  
    98         unless performed? 
    99           case 
    100           when options[:render] 
    101             render(options[:render]) 
    102           when options[:redirect_to] 
    103             options[:redirect_to] = self.send!(options[:redirect_to]) if options[:redirect_to].is_a?(Symbol) 
    104             redirect_to(options[:redirect_to]) 
    105           else 
    106             head(:bad_request) 
    107           end 
    108         end 
     94        apply_remaining_actions(options)               unless performed? 
    10995      end 
    11096    end 
    111  
    112     private :verify_action 
     97     
     98    def prereqs_invalid?(options) # :nodoc: 
     99      verify_presence_of_keys_in_hash_flash_or_params(options) ||  
     100      verify_method(options) ||  
     101      verify_request_xhr_status(options) 
     102    end 
     103  
     104    def verify_presence_of_keys_in_hash_flash_or_params(options) # :nodoc: 
     105      [*options[:params] ].find { |v| params[v].nil?  } || 
     106      [*options[:session]].find { |v| session[v].nil? } || 
     107      [*options[:flash]  ].find { |v| flash[v].nil?   } 
     108    end 
     109     
     110    def verify_method(options) # :nodoc: 
     111      [*options[:method]].all? { |v| request.method != v.to_sym } if options[:method] 
     112    end 
     113     
     114    def verify_request_xhr_status(options) # :nodoc: 
     115      request.xhr? != options[:xhr] unless options[:xhr].nil? 
     116    end 
     117     
     118    def apply_redirect_to(redirect_to_option) # :nodoc: 
     119      redirect_to_option.is_a?(Symbol) ? self.send!(redirect_to_option) : redirect_to_option 
     120    end 
     121     
     122    def apply_remaining_actions(options) # :nodoc: 
     123      case 
     124        when options[:render]      ; render(options[:render]) 
     125        when options[:redirect_to] ; redirect_to(apply_redirect_to(options[:redirect_to])) 
     126        else head(:bad_request) 
     127      end 
     128    end 
    113129  end 
    114130end