Class: ActionDispatch::Routing::RouteSet::Generator
- Inherits:
-
Object
- Object
- ActionDispatch::Routing::RouteSet::Generator
- Defined in:
- lib/action_dispatch/routing/route_set.rb
Constant Summary collapse
- PARAMETERIZE =
lambda do |name, value| if name == :controller value elsif value.is_a?(Array) value.map { |v| v.to_param }.join('/') elsif param = value.to_param param end end
Instance Attribute Summary collapse
-
#named_route ⇒ Object
readonly
Returns the value of attribute named_route.
-
#options ⇒ Object
readonly
Returns the value of attribute options.
-
#recall ⇒ Object
readonly
Returns the value of attribute recall.
-
#set ⇒ Object
readonly
Returns the value of attribute set.
Instance Method Summary collapse
- #controller ⇒ Object
- #current_controller ⇒ Object
- #different_controller? ⇒ Boolean
-
#generate ⇒ Object
Generates a path from routes, returns [path, params].
-
#initialize(named_route, options, recall, set) ⇒ Generator
constructor
A new instance of Generator.
-
#normalize_action! ⇒ Object
Move ‘index’ action from options to recall.
-
#normalize_controller! ⇒ Object
Remove leading slashes from controllers.
-
#normalize_controller_action_id! ⇒ Object
This pulls :controller, :action, and :id out of the recall.
- #normalize_options! ⇒ Object
-
#normalize_recall! ⇒ Object
Set ‘index’ as default action for recall.
- #use_recall_for(key) ⇒ Object
-
#use_relative_controller! ⇒ Object
if the current controller is “foo/bar/baz” and controller: “baz/bat” is specified, the controller becomes “foo/baz/bat”.
Constructor Details
#initialize(named_route, options, recall, set) ⇒ Generator
Returns a new instance of Generator.
629 630 631 632 633 634 635 636 637 638 639 640 641 |
# File 'lib/action_dispatch/routing/route_set.rb', line 629 def initialize(named_route, , recall, set) @named_route = named_route @options = .dup @recall = recall.dup @set = set normalize_recall! normalize_controller_action_id! use_relative_controller! normalize_controller! normalize_action! end |
Instance Attribute Details
#named_route ⇒ Object (readonly)
Returns the value of attribute named_route.
627 628 629 |
# File 'lib/action_dispatch/routing/route_set.rb', line 627 def named_route @named_route end |
#options ⇒ Object (readonly)
Returns the value of attribute options.
627 628 629 |
# File 'lib/action_dispatch/routing/route_set.rb', line 627 def @options end |
#recall ⇒ Object (readonly)
Returns the value of attribute recall.
627 628 629 |
# File 'lib/action_dispatch/routing/route_set.rb', line 627 def recall @recall end |
#set ⇒ Object (readonly)
Returns the value of attribute set.
627 628 629 |
# File 'lib/action_dispatch/routing/route_set.rb', line 627 def set @set end |
Instance Method Details
#controller ⇒ Object
643 644 645 |
# File 'lib/action_dispatch/routing/route_set.rb', line 643 def controller @options[:controller] end |
#current_controller ⇒ Object
647 648 649 |
# File 'lib/action_dispatch/routing/route_set.rb', line 647 def current_controller @recall[:controller] end |
#different_controller? ⇒ Boolean
724 725 726 727 |
# File 'lib/action_dispatch/routing/route_set.rb', line 724 def different_controller? return false unless current_controller controller.to_param != current_controller.to_param end |
#generate ⇒ Object
Generates a path from routes, returns [path, params]. If no route is generated the formatter will raise ActionController::UrlGenerationError
720 721 722 |
# File 'lib/action_dispatch/routing/route_set.rb', line 720 def generate @set.formatter.generate(named_route, , recall, PARAMETERIZE) end |
#normalize_action! ⇒ Object
Move ‘index’ action from options to recall
712 713 714 715 716 |
# File 'lib/action_dispatch/routing/route_set.rb', line 712 def normalize_action! if @options[:action] == 'index' @recall[:action] = @options.delete(:action) end end |
#normalize_controller! ⇒ Object
Remove leading slashes from controllers
707 708 709 |
# File 'lib/action_dispatch/routing/route_set.rb', line 707 def normalize_controller! @options[:controller] = controller.sub(%r{^/}, '') if controller end |
#normalize_controller_action_id! ⇒ Object
This pulls :controller, :action, and :id out of the recall. The recall key is only used if there is no key in the options or if the key in the options is identical. If any of :controller, :action or :id is not found, don’t pull any more keys from the recall.
689 690 691 692 693 |
# File 'lib/action_dispatch/routing/route_set.rb', line 689 def normalize_controller_action_id! use_recall_for(:controller) or return use_recall_for(:action) or return use_recall_for(:id) end |
#normalize_options! ⇒ Object
664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 |
# File 'lib/action_dispatch/routing/route_set.rb', line 664 def # If an explicit :controller was given, always make :action explicit # too, so that action expiry works as expected for things like # # generate({controller: 'content'}, {controller: 'content', action: 'show'}) # # (the above is from the unit tests). In the above case, because the # controller was explicitly given, but no action, the action is implied to # be "index", not the recalled action of "show". if [:controller] [:action] ||= 'index' [:controller] = [:controller].to_s end if .key?(:action) [:action] = ([:action] || 'index').to_s end end |
#normalize_recall! ⇒ Object
Set ‘index’ as default action for recall
660 661 662 |
# File 'lib/action_dispatch/routing/route_set.rb', line 660 def normalize_recall! @recall[:action] ||= 'index' end |
#use_recall_for(key) ⇒ Object
651 652 653 654 655 656 657 |
# File 'lib/action_dispatch/routing/route_set.rb', line 651 def use_recall_for(key) if @recall[key] && (!@options.key?(key) || @options[key] == @recall[key]) if !named_route_exists? || segment_keys.include?(key) @options[key] = @recall.delete(key) end end end |
#use_relative_controller! ⇒ Object
if the current controller is “foo/bar/baz” and controller: “baz/bat” is specified, the controller becomes “foo/baz/bat”
697 698 699 700 701 702 703 704 |
# File 'lib/action_dispatch/routing/route_set.rb', line 697 def use_relative_controller! if !named_route && different_controller? && !controller.start_with?("/") old_parts = current_controller.split('/') size = controller.count("/") + 1 parts = old_parts[0...-size] << controller @options[:controller] = parts.join("/") end end |