提交 35933822 编写于 作者: J José Valim

Ensure optional path scopes are properly handled.

上级 2835ec61
...@@ -68,13 +68,9 @@ def using_match_shorthand?(args, options) ...@@ -68,13 +68,9 @@ def using_match_shorthand?(args, options)
end end
def normalize_path(path) def normalize_path(path)
path = nil if path == "" path = "#{@scope[:path]}#{path}"
path = "#{@scope[:path]}#{path}" if @scope[:path] raise ArgumentError, "path is required" if path.empty?
path = Rack::Mount::Utils.normalize_path(path) if path Mapper.normalize_path(path)
raise ArgumentError, "path is required" unless path
path
end end
def app def app
...@@ -160,6 +156,14 @@ def default_controller ...@@ -160,6 +156,14 @@ def default_controller
end end
end end
# Invokes Rack::Mount::Utils.normalize path and ensure that
# (:locale) becomes (/:locale) instead of /(:locale).
def self.normalize_path(path)
path = Rack::Mount::Utils.normalize_path(path)
path.sub!(/^\/\(+\/?:/, '(/:')
path
end
module Base module Base
def initialize(set) def initialize(set)
@set = set @set = set
...@@ -245,7 +249,7 @@ def scope(*args) ...@@ -245,7 +249,7 @@ def scope(*args)
if path = options.delete(:path) if path = options.delete(:path)
path_set = true path_set = true
path, @scope[:path] = @scope[:path], Rack::Mount::Utils.normalize_path(@scope[:path].to_s + path.to_s) path, @scope[:path] = @scope[:path], Mapper.normalize_path(@scope[:path].to_s + path.to_s)
else else
path_set = false path_set = false
end end
......
...@@ -129,6 +129,16 @@ def self.matches?(request) ...@@ -129,6 +129,16 @@ def self.matches?(request)
resources :rooms resources :rooms
end end
scope '(:locale)', :locale => /en|pl/ do
resources :descriptions
end
namespace :admin do
scope '(/:locale)', :locale => /en|pl/ do
resources :descriptions
end
end
match '/info' => 'projects#info', :as => 'info' match '/info' => 'projects#info', :as => 'info'
root :to => 'projects#index' root :to => 'projects#index'
...@@ -594,6 +604,48 @@ def test_redirect_with_port ...@@ -594,6 +604,48 @@ def test_redirect_with_port
self.host = previous_host self.host = previous_host
end end
def test_optional_scoped_path
with_test_routes do
assert_equal '/en/descriptions', descriptions_path("en")
assert_equal '/descriptions', descriptions_path(nil)
assert_equal '/en/descriptions/1', description_path("en", 1)
assert_equal '/descriptions/1', description_path(nil, 1)
get '/en/descriptions'
assert_equal 'descriptions#index', @response.body
get '/descriptions'
assert_equal 'descriptions#index', @response.body
get '/en/descriptions/1'
assert_equal 'descriptions#show', @response.body
get '/descriptions/1'
assert_equal 'descriptions#show', @response.body
end
end
def test_nested_optional_scoped_path
with_test_routes do
assert_equal '/admin/en/descriptions', admin_descriptions_path("en")
assert_equal '/admin/descriptions', admin_descriptions_path(nil)
assert_equal '/admin/en/descriptions/1', admin_description_path("en", 1)
assert_equal '/admin/descriptions/1', admin_description_path(nil, 1)
get '/admin/en/descriptions'
assert_equal 'admin/descriptions#index', @response.body
get '/admin/descriptions'
assert_equal 'admin/descriptions#index', @response.body
get '/admin/en/descriptions/1'
assert_equal 'admin/descriptions#show', @response.body
get '/admin/descriptions/1'
assert_equal 'admin/descriptions#show', @response.body
end
end
private private
def with_test_routes def with_test_routes
real_routes, temp_routes = ActionController::Routing::Routes, Routes real_routes, temp_routes = ActionController::Routing::Routes, Routes
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册