Refactor handling of action normalization

Reference:
Bloody mess internals
http://gusiev.com/slides/rails_contribution/static/#40
This commit is contained in:
Max Shytikov 2012-12-07 13:15:31 +02:00 committed by Andrew White
parent 633be2cbbd
commit 310fc2b8c1
1 changed files with 13 additions and 11 deletions

View File

@ -514,11 +514,12 @@ module ActionDispatch
@recall = recall.dup
@set = set
normalize_recall!
normalize_options!
normalize_controller_action_id!
use_relative_controller!
normalize_controller!
handle_nil_action!
normalize_action!
end
def controller
@ -537,6 +538,11 @@ module ActionDispatch
end
end
# Set 'index' as default action for recall
def normalize_recall!
@recall[:action] ||= 'index'
end
def normalize_options!
# If an explicit :controller was given, always make :action explicit
# too, so that action expiry works as expected for things like
@ -552,8 +558,8 @@ module ActionDispatch
options[:controller] = options[:controller].to_s
end
if options[:action]
options[:action] = options[:action].to_s
if options.key?(:action)
options[:action] = (options[:action] || 'index').to_s
end
end
@ -563,8 +569,6 @@ module ActionDispatch
# :controller, :action or :id is not found, don't pull any
# more keys from the recall.
def normalize_controller_action_id!
@recall[:action] ||= 'index' if current_controller
use_recall_for(:controller) or return
use_recall_for(:action) or return
use_recall_for(:id)
@ -586,13 +590,11 @@ module ActionDispatch
@options[:controller] = controller.sub(%r{^/}, '') if controller
end
# This handles the case of action: nil being explicitly passed.
# It is identical to action: "index"
def handle_nil_action!
if options.has_key?(:action) && options[:action].nil?
options[:action] = 'index'
# Move 'index' action from options to recall
def normalize_action!
if @options[:action] == 'index'
@recall[:action] = @options.delete(:action)
end
recall[:action] = options.delete(:action) if options[:action] == 'index'
end
# Generates a path from routes, returns [path, params].