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

Changeset 51

Show
Ignore:
Timestamp:
12/06/04 18:25:01 (4 years ago)
Author:
david
Message:

Syntax errors and other exceptions thrown outside of an action are now gracefully handled by the dispatcher

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/actionpack

    • Property svn:ignore set to
      pkg
      doc
    • Property svn:ignores set to pkg
  • trunk/actionpack/lib/action_controller.rb

    r28 r51  
    3333require 'action_controller/layout' 
    3434require 'action_controller/flash' 
     35require 'action_controller/dependencies' 
    3536require 'action_controller/scaffolding' 
    3637require 'action_controller/helpers' 
    37 require 'action_controller/dependencies' 
    3838require 'action_controller/cookies' 
    3939require 'action_controller/cgi_process' 
     
    4545  include ActionController::Benchmarking 
    4646  include ActionController::Rescue 
     47  include ActionController::Dependencies 
    4748  include ActionController::Scaffolding 
    4849  include ActionController::Helpers 
    49   include ActionController::Dependencies 
    5050  include ActionController::Cookies 
    5151end 
  • trunk/actionpack/lib/action_controller/base.rb

    r33 r51  
    55require 'action_controller/support/class_inheritable_attributes' 
    66require 'action_controller/support/inflector' 
    7  
    8 unless Object.respond_to?(:require_dependency) 
    9   Object.send(:define_method, :require_dependency) { |file_name| ActionController::Base.require_dependency(file_name) } 
    10 end 
    117 
    128module ActionController #:nodoc: 
     
    198194    cattr_accessor :consider_all_requests_local 
    199195 
    200     # When turned on (which is default), all dependencies are included using "load". This mean that any change is instant in cached 
    201     # environments like mod_ruby or FastCGI. When set to false, "require" is used, which is faster but requires server restart to 
    202     # be effective. 
    203     @@reload_dependencies = true 
    204     cattr_accessor :reload_dependencies 
    205  
    206196    # Template root determines the base from which template references will be made. So a call to render("test/template") 
    207197    # will be converted to "#{template_root}/test/template.rhtml". 
     
    249239        new.process(request, response) 
    250240      end 
    251  
     241       
    252242      # Converts the class name from something like "OneModule::TwoModule::NeatController" to "NeatController". 
    253243      def controller_class_name 
     
    259249        Inflector.underscore(controller_class_name.sub(/Controller/, "")) 
    260250      end 
    261  
    262       # Loads the <tt>file_name</tt> if reload_dependencies is true or requires if it's false. 
    263       def require_dependency(file_name) 
    264         reload_dependencies ? silence_warnings { load("#{file_name}.rb") } : require(file_name) 
    265       end 
    266251    end 
    267252 
    268253    public 
    269254      # Extracts the action_name from the request parameters and performs that action. 
    270       def process(request, response) #:nodoc: 
     255      def process(request, response, method = :perform_action, *arguments) #:nodoc: 
    271256        initialize_template_class(response) 
    272257        assign_shortcuts(request, response) 
     
    274259 
    275260        log_processing unless logger.nil? 
    276         perform_action 
     261        send(method, *arguments) 
    277262        close_session 
    278263 
  • trunk/actionpack/lib/action_controller/dependencies.rb

    r32 r51  
     1unless Object.respond_to?(:require_dependency) 
     2  Object.send(:define_method, :require_dependency) { |file_name| ActionController::Base.require_dependency(file_name) } 
     3end 
     4 
    15module ActionController #:nodoc: 
    26  module Dependencies #:nodoc: 
    37    def self.append_features(base) 
    48      super 
     9 
     10      base.class_eval do 
     11        # When turned on (which is default), all dependencies are included using "load". This mean that any change is instant in cached 
     12        # environments like mod_ruby or FastCGI. When set to false, "require" is used, which is faster but requires server restart to 
     13        # be effective. 
     14        @@reload_dependencies = true 
     15        cattr_accessor :reload_dependencies 
     16      end 
     17 
    518      base.extend(ClassMethods) 
    619    end 
    720 
    821    module ClassMethods 
     22      # Loads the <tt>file_name</tt> if reload_dependencies is true or requires if it's false. 
     23      def require_dependency(file_name) 
     24        reload_dependencies ? silence_warnings { load("#{file_name}.rb") } : require(file_name) 
     25      end 
     26       
    927      def model(*models) 
    1028        require_dependencies(:model, models) 
  • trunk/actionpack/lib/action_controller/rescue.rb

    r30 r51  
    99    def self.append_features(base) #:nodoc: 
    1010      super 
     11      base.extend(ClassMethods) 
    1112      base.class_eval do 
    1213        alias_method :perform_action_without_rescue, :perform_action 
    1314        alias_method :perform_action, :perform_action_with_rescue 
     15      end 
     16    end 
     17 
     18    module ClassMethods 
     19      def process_with_exception(request, response, exception) 
     20        new.process(request, response, :rescue_action, exception) 
    1421      end 
    1522    end 
     
    8895       
    8996      def clean_backtrace(exception) 
    90         base_dir = File.expand_path(File.dirname(__FILE__) + "/../../../../") 
    91         exception.backtrace.collect { |line| line.gsub(base_dir, "").gsub("/public/../config/environments/../../", "").gsub("/public/../", "") } 
     97        exception.backtrace.collect { |line| Object.const_defined?(:RAILS_ROOT) ? line.gsub(RAILS_ROOT, "") : line } 
    9298      end 
    9399  end 
  • trunk/actionpack/lib/action_controller/templates/rescues/_request_and_response.rhtml

    r4 r51  
    11<% 
    2   base_dir = File.expand_path(File.dirname(__FILE__)) 
    3      
    42  request_parameters_without_action = @request.parameters.clone 
    53  request_parameters_without_action.delete("action") 
  • trunk/actionpack/lib/action_controller/templates/rescues/diagnostics.rhtml

    r4 r51  
    11<% 
    2   base_dir = File.expand_path(File.dirname(__FILE__)) 
    3      
    4   clean_backtrace = @exception.backtrace.collect { |line| line.gsub(base_dir, "").gsub("/../config/environments/../../", "") } 
    5   app_trace       = clean_backtrace.reject { |line| line[0..6] == "vendor/" || line.include?("dispatch.cgi") } 
     2  clean_backtrace = @exception.backtrace.collect { |line| Object.const_defined?(:RAILS_ROOT) ? line.gsub(RAILS_ROOT, "") : line } 
     3  app_trace       = clean_backtrace.reject { |line| line =~ /(vendor|dispatch|ruby)/ } 
    64  framework_trace = clean_backtrace - app_trace 
    75%> 
     
    119  <%=h @request.parameters["controller"].capitalize %>#<%=h @request.parameters["action"] %> 
    1210</h1> 
    13 <p><%=h @exception.message %></p> 
     11<p><%=h Object.const_defined?(:RAILS_ROOT) ? @exception.message.gsub(RAILS_ROOT, "") : @exception.message %></p> 
    1412 
    15 <% unless app_trace.empty? %><pre><code><%=h app_trace.collect { |line| line.gsub("/../", "") }.join("\n") %></code></pre><% end %> 
     13<% unless app_trace.empty? %><pre><code><%=h app_trace.join("\n") %></code></pre><% end %> 
    1614 
    1715<% unless framework_trace.empty? %> 
  • trunk/actionpack/lib/action_controller/templates/rescues/template_error.rhtml

    r4 r51  
    1 <% 
    2   base_dir = File.expand_path(File.dirname(__FILE__)) 
    3    
    4   framework_trace = @exception.original_exception.backtrace.collect do |line|  
    5     line.gsub(base_dir, "").gsub("/../config/environments/../../", "") 
    6   end 
    7 %> 
    8  
    91<h1> 
    102  <%=h @exception.original_exception.class.to_s %> in 
     
    2214 
    2315<a href="#" onclick="document.getElementById('framework_trace').style.display='block'">Show template trace</a> 
    24 <pre id="framework_trace" style="display:none"><code><%=h framework_trace.join("\n") %></code></pre> 
     16<pre id="framework_trace" style="display:none"><code><%=h @exception.original_exception.backtrace.collect { |line| Object.const_defined?(:RAILS_ROOT) ? line.gsub(RAILS_ROOT, "") : line }.join("\n") %></code></pre> 
    2517 
    2618<%= render_file(@rescues_path + "/_request_and_response.rhtml", false) %> 
  • trunk/actionpack/README

    r4 r51  
    326326    def create 
    327327      @post = Post.create(@params["post"]) 
    328       @post.save 
    329328      redirect_to :action => "display", :id => @post.id 
    330329    end 
  • trunk/railties

    • Property svn:ignore set to
      pkg
  • trunk/railties/lib/dispatcher.rb

    r32 r51  
    2525  DEFAULT_SESSION_OPTIONS = { "database_manager" => CGI::Session::PStore, "prefix" => "ruby_sess.", "session_path" => "/" } 
    2626 
    27   def self.dispatch(cgi = CGI.new, session_options = DEFAULT_SESSION_OPTIONS, error_page = nil
     27  def self.dispatch(cgi = CGI.new, session_options = DEFAULT_SESSION_OPTIONS
    2828    begin 
    2929      request  = ActionController::CgiRequest.new(cgi, session_options) 
     
    3636 
    3737      controller_class(controller_name).process(request, response).out 
    38     rescue Object => e 
    39       begin 
    40         ActionController::Base.logger.info "\n\nException throw during dispatch: #{e.message}\n#{e.backtrace.join("\n")}" 
    41       rescue Exception 
    42         # Couldn't log error 
    43       end 
    44        
    45       if error_page then cgi.out{ IO.readlines(error_page) } else raise e end 
     38    rescue Object => exception 
     39      ActionController::Base.process_with_exception(request, response, exception).out 
    4640    ensure 
    4741      ActiveRecord::Base.reset_associations_loaded 
  • trunk/railties/lib/generator.rb

    r36 r51  
    7474  end 
    7575 
    76   # Generate model, unit test, and fixtures. 
     76  # Generate model, unit test, and fixtures.  
    7777  class Model < Base 
    7878    def generate 
  • trunk/railties/lib/webrick_server.rb

    r4 r51  
    8686      return true 
    8787    rescue => err 
    88       p err 
    8988      return false 
    9089    end