class ActionDispatch::Routing::RouteSet::Dispatcher
:nodoc:
def call(env)
def call(env) params = env[PARAMETERS_KEY] # If any of the path parameters has an invalid encoding then # raise since it's likely to trigger errors further on. params.each do |key, value| next unless value.respond_to?(:valid_encoding?) unless value.valid_encoding? raise ActionController::BadRequest, "Invalid parameter: #{key} => #{value}" end end prepare_params!(params) # Just raise undefined constant errors if a controller was specified as default. unless controller = controller(params, @defaults.key?(:controller)) return [404, {'X-Cascade' => 'pass'}, []] end dispatch(controller, params[:action], env) end
def controller(params, default_controller=true)
delegate the control back to Rack cascade. Besides, if this is not a default
segment, as in :controller(/:action), we should simply return nil and
a user error. However, if the controller was retrieved through a dynamic
we should raise an error in case it's not found, because it usually means
If this is a default_controller (i.e. a controller specified by the user)
def controller(params, default_controller=true) if params && params.key?(:controller) controller_param = params[:controller] controller_reference(controller_param) end rescue NameError => e raise ActionController::RoutingError, e.message, e.backtrace if default_controller end
def controller_reference(controller_param)
def controller_reference(controller_param) const_name = @controller_class_names[controller_param] ||= "#{controller_param.camelize}Controller" ActiveSupport::Dependencies.constantize(const_name) end
def dispatch(controller, action, env)
def dispatch(controller, action, env) controller.action(action).call(env) end
def initialize(options={})
def initialize(options={}) @defaults = options[:defaults] @glob_param = options.delete(:glob) @controller_class_names = ThreadSafe::Cache.new end
def merge_default_action!(params)
def merge_default_action!(params) params[:action] ||= 'index' end
def normalize_controller!(params)
def normalize_controller!(params) params[:controller] = params[:controller].underscore if params.key?(:controller) end
def prepare_params!(params)
def prepare_params!(params) normalize_controller!(params) merge_default_action!(params) split_glob_param!(params) if @glob_param end
def split_glob_param!(params)
def split_glob_param!(params) params[@glob_param] = params[@glob_param].split('/').map { |v| URI.parser.unescape(v) } end