Skip to content
Browse files

Generate URLs for :action => index when :action => nil is supplied.

git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@1826 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
  • Loading branch information...
1 parent 9314793 commit 2bd4ff11f83a44d3364e3e5ceaa17d1a10320687 @seckar seckar committed
Showing with 51 additions and 8 deletions.
  1. +13 −4 actionpack/lib/action_controller/routing.rb
  2. +38 −4 actionpack/test/controller/routing_test.rb
View
17 actionpack/lib/action_controller/routing.rb
@@ -26,15 +26,19 @@ def treat_hash(hash)
end
hash
end
- end
-
- class << self
+
def test_condition(expression, condition)
case condition
when String then "(#{expression} == #{condition.inspect})"
when Regexp then
condition = Regexp.new("^#{condition.source}$") unless /^\^.*\$$/ =~ condition.source
"(#{condition.inspect} =~ #{expression})"
+ when Array then
+ conds = condition.collect do |condition|
+ cond = test_condition(expression, condition)
+ (cond[0, 1] == '(' && cond[-1, 1] == ')') ? cond : "(#{cond})"
+ end
+ "(#{conds.join(' || ')})"
when true then expression
when nil then "! #{expression}"
else
@@ -272,6 +276,7 @@ def initialize(path, options = {})
defaults, conditions = initialize_hashes options.dup
@defaults = defaults.dup
configure_components(defaults, conditions)
+ add_default_requirements
initialize_keys
end
@@ -324,7 +329,6 @@ def matches_controller?(controller)
end
protected
-
def initialize_components(path)
path = path.split('/') if path.is_a? String
path.shift if path.first.blank?
@@ -356,6 +360,11 @@ def configure_components(defaults, conditions)
component.condition = conditions[component.key] if conditions.key?(component.key)
end
end
+
+ def add_default_requirements
+ component_keys = components.collect {|c| c.key}
+ known[:action] ||= [nil, 'index'] unless component_keys.include? :action
+ end
end
class RouteSet #:nodoc:
View
42 actionpack/test/controller/routing_test.rb
@@ -504,16 +504,19 @@ def gen(options, recall = nil, show = false)
end
def test_static
- route 'hello/world', :known => 'known_value'
+ route 'hello/world', :known => 'known_value', :controller => 'content', :action => 'index'
assert_nil rec('hello/turn')
assert_nil rec('turn/world')
- assert_equal({:known => 'known_value'}, rec('hello/world'))
+ assert_equal(
+ {:known => 'known_value', :controller => ::Controllers::ContentController, :action => 'index'},
+ rec('hello/world')
+ )
assert_nil gen(:known => 'foo')
assert_nil gen({})
- assert_equal '/hello/world', gen(:known => 'known_value')
- assert_equal '/hello/world', gen(:known => 'known_value', :extra => 'hi')
+ assert_equal '/hello/world', gen(:known => 'known_value', :controller => 'content', :action => 'index')
+ assert_equal '/hello/world', gen(:known => 'known_value', :extra => 'hi', :controller => 'content', :action => 'index')
assert_equal [:extra], route.extra_keys(:known => 'known_value', :extra => 'hi')
end
@@ -800,8 +803,39 @@ def test_both_requirement_and_optional
assert_equal({:controller => '/post', :action => 'show'},
x.new.send(:blog_url))
end
+
+ def test_set_to_nil_forgets
+ rs.draw do
+ rs.connect 'pages/:year/:month/:day', :controller => 'content', :action => 'list_pages', :month => nil, :day => nil
+ rs.connect ':controller/:action/:id'
+ end
+
+ assert_equal ['/pages/2005', {}],
+ rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005)
+ assert_equal ['/pages/2005/6', {}],
+ rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6)
+ assert_equal ['/pages/2005/6/12', {}],
+ rs.generate(:controller => 'content', :action => 'list_pages', :year => 2005, :month => 6, :day => 12)
+
+ assert_equal ['/pages/2005/6/4', {}],
+ rs.generate({:day => 4}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
+ assert_equal ['/pages/2005/6', {}],
+ rs.generate({:day => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
+ assert_equal ['/pages/2005', {}],
+ rs.generate({:day => nil, :month => nil}, {:controller => 'content', :action => 'list_pages', :year => '2005', :month => '6', :day => '12'})
+ end
+
+ def test_url_with_no_action_specified
+ rs.draw do
+ rs.connect '', :controller => 'content'
+ rs.connect ':controller/:action/:id'
+ end
+
+ assert_equal ['/', {}], rs.generate(:controller => 'content', :action => 'index')
+ assert_equal ['/', {}], rs.generate(:controller => 'content')
+ end
end
end

0 comments on commit 2bd4ff1

Please sign in to comment.
Something went wrong with that request. Please try again.