Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
e0513e33
R
rails
项目概览
张重言
/
rails
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
rails
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
e0513e33
编写于
7月 28, 2008
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Routing whitespace cleanup
上级
6e754551
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
84 addition
and
89 deletion
+84
-89
actionpack/lib/action_controller/assertions/routing_assertions.rb
...ck/lib/action_controller/assertions/routing_assertions.rb
+22
-22
actionpack/lib/action_controller/routing.rb
actionpack/lib/action_controller/routing.rb
+28
-30
actionpack/lib/action_controller/routing/optimisations.rb
actionpack/lib/action_controller/routing/optimisations.rb
+11
-11
actionpack/lib/action_controller/routing/recognition_optimisation.rb
...lib/action_controller/routing/recognition_optimisation.rb
+0
-2
actionpack/lib/action_controller/routing/route.rb
actionpack/lib/action_controller/routing/route.rb
+7
-8
actionpack/lib/action_controller/routing/route_set.rb
actionpack/lib/action_controller/routing/route_set.rb
+2
-2
actionpack/lib/action_controller/routing/routing_ext.rb
actionpack/lib/action_controller/routing/routing_ext.rb
+0
-1
actionpack/lib/action_controller/routing/segments.rb
actionpack/lib/action_controller/routing/segments.rb
+3
-2
actionpack/test/controller/routing_test.rb
actionpack/test/controller/routing_test.rb
+1
-0
actionpack/test/controller/test_test.rb
actionpack/test/controller/test_test.rb
+10
-11
未找到文件。
actionpack/lib/action_controller/assertions/routing_assertions.rb
浏览文件 @
e0513e33
...
...
@@ -2,7 +2,7 @@ module ActionController
module
Assertions
# Suite of assertions to test routes generated by Rails and the handling of requests made to them.
module
RoutingAssertions
# Asserts that the routing of the given +path+ was handled correctly and that the parsed options (given in the +expected_options+ hash)
# Asserts that the routing of the given +path+ was handled correctly and that the parsed options (given in the +expected_options+ hash)
# match +path+. Basically, it asserts that Rails recognizes the route given by +expected_options+.
#
# Pass a hash in the second argument (+path+) to specify the request method. This is useful for routes
...
...
@@ -14,16 +14,16 @@ module RoutingAssertions
#
# You can also pass in +extras+ with a hash containing URL parameters that would normally be in the query string. This can be used
# to assert that values in the query string string will end up in the params hash correctly. To test query strings you must use the
# extras argument, appending the query string on the path directly will not work. For example:
# extras argument, appending the query string on the path directly will not work. For example:
#
# # assert that a path of '/items/list/1?view=print' returns the correct options
# assert_recognizes({:controller => 'items', :action => 'list', :id => '1', :view => 'print'}, 'items/list/1', { :view => "print" })
# assert_recognizes({:controller => 'items', :action => 'list', :id => '1', :view => 'print'}, 'items/list/1', { :view => "print" })
#
# The +message+ parameter allows you to pass in an error message that is displayed upon failure.
# The +message+ parameter allows you to pass in an error message that is displayed upon failure.
#
# ==== Examples
# # Check the default route (i.e., the index action)
# assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
# assert_recognizes({:controller => 'items', :action => 'index'}, 'items')
#
# # Test a specific action
# assert_recognizes({:controller => 'items', :action => 'list'}, 'items/list')
...
...
@@ -44,16 +44,16 @@ def assert_recognizes(expected_options, path, extras={}, message=nil)
request_method
=
nil
end
clean_backtrace
do
ActionController
::
Routing
::
Routes
.
reload
if
ActionController
::
Routing
::
Routes
.
empty?
clean_backtrace
do
ActionController
::
Routing
::
Routes
.
reload
if
ActionController
::
Routing
::
Routes
.
empty?
request
=
recognized_request_for
(
path
,
request_method
)
expected_options
=
expected_options
.
clone
extras
.
each_key
{
|
key
|
expected_options
.
delete
key
}
unless
extras
.
nil?
expected_options
.
stringify_keys!
routing_diff
=
expected_options
.
diff
(
request
.
path_parameters
)
msg
=
build_message
(
message
,
"The recognized options <?> did not match <?>, difference: <?>"
,
msg
=
build_message
(
message
,
"The recognized options <?> did not match <?>, difference: <?>"
,
request
.
path_parameters
,
expected_options
,
expected_options
.
diff
(
request
.
path_parameters
))
assert_block
(
msg
)
{
request
.
path_parameters
==
expected_options
}
end
...
...
@@ -64,7 +64,7 @@ def assert_recognizes(expected_options, path, extras={}, message=nil)
# a query string. The +message+ parameter allows you to specify a custom error message for assertion failures.
#
# The +defaults+ parameter is unused.
#
#
# ==== Examples
# # Asserts that the default action is generated for a route with no action
# assert_generates("/items", :controller => "items", :action => "index")
...
...
@@ -73,34 +73,34 @@ def assert_recognizes(expected_options, path, extras={}, message=nil)
# assert_generates("/items/list", :controller => "items", :action => "list")
#
# # Tests the generation of a route with a parameter
# assert_generates("/items/list/1", { :controller => "items", :action => "list", :id => "1" })
# assert_generates("/items/list/1", { :controller => "items", :action => "list", :id => "1" })
#
# # Asserts that the generated route gives us our custom route
# assert_generates "changesets/12", { :controller => 'scm', :action => 'show_diff', :revision => "12" }
def
assert_generates
(
expected_path
,
options
,
defaults
=
{},
extras
=
{},
message
=
nil
)
clean_backtrace
do
clean_backtrace
do
expected_path
=
"/
#{
expected_path
}
"
unless
expected_path
[
0
]
==
?/
# Load routes.rb if it hasn't been loaded.
ActionController
::
Routing
::
Routes
.
reload
if
ActionController
::
Routing
::
Routes
.
empty?
ActionController
::
Routing
::
Routes
.
reload
if
ActionController
::
Routing
::
Routes
.
empty?
generated_path
,
extra_keys
=
ActionController
::
Routing
::
Routes
.
generate_extras
(
options
,
defaults
)
found_extras
=
options
.
reject
{
|
k
,
v
|
!
extra_keys
.
include?
k
}
msg
=
build_message
(
message
,
"found extras <?>, not <?>"
,
found_extras
,
extras
)
assert_block
(
msg
)
{
found_extras
==
extras
}
msg
=
build_message
(
message
,
"The generated path <?> did not match <?>"
,
generated_path
,
msg
=
build_message
(
message
,
"The generated path <?> did not match <?>"
,
generated_path
,
expected_path
)
assert_block
(
msg
)
{
expected_path
==
generated_path
}
end
end
# Asserts that path and options match both ways; in other words, it verifies that <tt>path</tt> generates
# Asserts that path and options match both ways; in other words, it verifies that <tt>path</tt> generates
# <tt>options</tt> and then that <tt>options</tt> generates <tt>path</tt>. This essentially combines +assert_recognizes+
# and +assert_generates+ into one step.
#
# The +extras+ hash allows you to specify options that would normally be provided as a query string to the action. The
# +message+ parameter allows you to specify a custom error message to display upon failure.
# +message+ parameter allows you to specify a custom error message to display upon failure.
#
# ==== Examples
# # Assert a basic route: a controller with the default action (index)
...
...
@@ -119,12 +119,12 @@ def assert_generates(expected_path, options, defaults={}, extras = {}, message=n
# assert_routing({ :method => 'put', :path => '/product/321' }, { :controller => "product", :action => "update", :id => "321" })
def
assert_routing
(
path
,
options
,
defaults
=
{},
extras
=
{},
message
=
nil
)
assert_recognizes
(
options
,
path
,
extras
,
message
)
controller
,
default_controller
=
options
[
:controller
],
defaults
[
:controller
]
controller
,
default_controller
=
options
[
:controller
],
defaults
[
:controller
]
if
controller
&&
controller
.
include?
(
?/
)
&&
default_controller
&&
default_controller
.
include?
(
?/
)
options
[
:controller
]
=
"/
#{
controller
}
"
end
assert_generates
(
path
.
is_a?
(
Hash
)
?
path
[
:path
]
:
path
,
options
,
defaults
,
extras
,
message
)
end
...
...
actionpack/lib/action_controller/routing.rb
浏览文件 @
e0513e33
...
...
@@ -201,7 +201,7 @@ module ActionController
# With conditions you can define restrictions on routes. Currently the only valid condition is <tt>:method</tt>.
#
# * <tt>:method</tt> - Allows you to specify which method can access the route. Possible values are <tt>:post</tt>,
# <tt>:get</tt>, <tt>:put</tt>, <tt>:delete</tt> and <tt>:any</tt>. The default value is <tt>:any</tt>,
# <tt>:get</tt>, <tt>:put</tt>, <tt>:delete</tt> and <tt>:any</tt>. The default value is <tt>:any</tt>,
# <tt>:any</tt> means that any method can access the route.
#
# Example:
...
...
@@ -213,7 +213,7 @@ module ActionController
#
# Now, if you POST to <tt>/posts/:id</tt>, it will route to the <tt>create_comment</tt> action. A GET on the same
# URL will route to the <tt>show</tt> action.
#
#
# == Reloading routes
#
# You can reload routes if you feel you must:
...
...
@@ -281,9 +281,9 @@ module Helpers
end
class
<<
self
# Expects an array of controller names as the first argument.
# Executes the passed block with only the named controllers named available.
# This method is used in internal Rails testing.
# Expects an array of controller names as the first argument.
# Executes the passed block with only the named controllers named available.
# This method is used in internal Rails testing.
def
with_controllers
(
names
)
prior_controllers
=
@possible_controllers
use_controllers!
names
...
...
@@ -292,10 +292,10 @@ def with_controllers(names)
use_controllers!
prior_controllers
end
# Returns an array of paths, cleaned of double-slashes and relative path references.
# * "\\\" and "//" become "\\" or "/".
# * "/foo/bar/../config" becomes "/foo/config".
# The returned array is sorted by length, descending.
# Returns an array of paths, cleaned of double-slashes and relative path references.
# * "\\\" and "//" become "\\" or "/".
# * "/foo/bar/../config" becomes "/foo/config".
# The returned array is sorted by length, descending.
def
normalize_paths
(
paths
)
# do the hokey-pokey of path normalization...
paths
=
paths
.
collect
do
|
path
|
...
...
@@ -314,7 +314,7 @@ def normalize_paths(paths)
paths
=
paths
.
uniq
.
sort_by
{
|
path
|
-
path
.
length
}
end
# Returns the array of controller names currently available to ActionController::Routing.
# Returns the array of controller names currently available to ActionController::Routing.
def
possible_controllers
unless
@possible_controllers
@possible_controllers
=
[]
...
...
@@ -339,28 +339,27 @@ def possible_controllers
@possible_controllers
end
# Replaces the internal list of controllers available to ActionController::Routing with the passed argument.
# ActionController::Routing.use_controllers!([ "posts", "comments", "admin/comments" ])
# Replaces the internal list of controllers available to ActionController::Routing with the passed argument.
# ActionController::Routing.use_controllers!([ "posts", "comments", "admin/comments" ])
def
use_controllers!
(
controller_names
)
@possible_controllers
=
controller_names
end
# Returns a controller path for a new +controller+ based on a +previous+ controller path.
# Handles 4 scenarios:
#
# * stay in the previous controller:
# controller_relative_to( nil, "groups/discussion" ) # => "groups/discussion"
#
# * stay in the previous namespace:
# controller_relative_to( "posts", "groups/discussion" ) # => "groups/posts"
#
# * forced move to the root namespace:
# controller_relative_to( "/posts", "groups/discussion" ) # => "posts"
#
# * previous namespace is root:
# controller_relative_to( "posts", "anything_with_no_slashes" ) # =>"posts"
#
# Returns a controller path for a new +controller+ based on a +previous+ controller path.
# Handles 4 scenarios:
#
# * stay in the previous controller:
# controller_relative_to( nil, "groups/discussion" ) # => "groups/discussion"
#
# * stay in the previous namespace:
# controller_relative_to( "posts", "groups/discussion" ) # => "groups/posts"
#
# * forced move to the root namespace:
# controller_relative_to( "/posts", "groups/discussion" ) # => "posts"
#
# * previous namespace is root:
# controller_relative_to( "posts", "anything_with_no_slashes" ) # =>"posts"
#
def
controller_relative_to
(
controller
,
previous
)
if
controller
.
nil?
then
previous
elsif
controller
[
0
]
==
?/
then
controller
[
1
..-
1
]
...
...
@@ -369,12 +368,11 @@ def controller_relative_to(controller, previous)
end
end
end
Routes
=
RouteSet
.
new
ActiveSupport
::
Inflector
.
module_eval
do
# Ensures that routes are reloaded when Rails inflections are updated.
# Ensures that routes are reloaded when Rails inflections are updated.
def
inflections_with_route_reloading
(
&
block
)
returning
(
inflections_without_route_reloading
(
&
block
))
{
ActionController
::
Routing
::
Routes
.
reload!
if
block_given?
...
...
actionpack/lib/action_controller/routing/optimisations.rb
浏览文件 @
e0513e33
module
ActionController
module
Routing
# Much of the slow performance from routes comes from the
# Much of the slow performance from routes comes from the
# complexity of expiry, <tt>:requirements</tt> matching, defaults providing
# and figuring out which url pattern to use. With named routes
# we can avoid the expense of finding the right route. So if
# and figuring out which url pattern to use. With named routes
# we can avoid the expense of finding the right route. So if
# they've provided the right number of arguments, and have no
# <tt>:requirements</tt>, we can just build up a string and return it.
#
# To support building optimisations for other common cases, the
# generation code is separated into several classes
#
# To support building optimisations for other common cases, the
# generation code is separated into several classes
module
Optimisation
def
generate_optimisation_block
(
route
,
kind
)
return
""
unless
route
.
optimise?
...
...
@@ -53,12 +53,12 @@ def applicable?
# map.person '/people/:id'
#
# If the user calls <tt>person_url(@person)</tt>, we can simply
# return a string like "/people/#{@person.to_param}"
# return a string like "/people/#{@person.to_param}"
# rather than triggering the expensive logic in +url_for+.
class
PositionalArguments
<
Optimiser
def
guard_condition
number_of_arguments
=
route
.
segment_keys
.
size
# if they're using foo_url(:id=>2) it's one
# if they're using foo_url(:id=>2) it's one
# argument, but we don't want to generate /foos/id2
if
number_of_arguments
==
1
"(!defined?(default_url_options) || default_url_options.blank?) && defined?(request) && request && args.size == 1 && !args.first.is_a?(Hash)"
...
...
@@ -94,14 +94,14 @@ def generation_code
end
# This case is mostly the same as the positional arguments case
# above, but it supports additional query parameters as the last
# above, but it supports additional query parameters as the last
# argument
class
PositionalArgumentsWithAdditionalParams
<
PositionalArguments
def
guard_condition
"(!defined?(default_url_options) || default_url_options.blank?) && defined?(request) && request && args.size ==
#{
route
.
segment_keys
.
size
+
1
}
&& !args.last.has_key?(:anchor) && !args.last.has_key?(:port) && !args.last.has_key?(:host)"
end
# This case uses almost the same code as positional arguments,
# This case uses almost the same code as positional arguments,
# but add an args.last.to_query on the end
def
generation_code
super
.
insert
(
-
2
,
'?#{args.last.to_query}'
)
...
...
@@ -110,7 +110,7 @@ def generation_code
# To avoid generating "http://localhost/?host=foo.example.com" we
# can't use this optimisation on routes without any segments
def
applicable?
super
&&
route
.
segment_keys
.
size
>
0
super
&&
route
.
segment_keys
.
size
>
0
end
end
...
...
actionpack/lib/action_controller/routing/recognition_optimisation.rb
浏览文件 @
e0513e33
...
...
@@ -51,7 +51,6 @@ module Routing
# 3) segm test for /users/:id
# (jump to list index = 5)
# 4) full test for /users/:id => here we are!
class
RouteSet
def
recognize_path
(
path
,
environment
=
{})
result
=
recognize_optimized
(
path
,
environment
)
and
return
result
...
...
@@ -152,7 +151,6 @@ def to_plain_segments(str)
segments
<<
nil
segments
end
end
end
end
actionpack/lib/action_controller/routing/route.rb
浏览文件 @
e0513e33
...
...
@@ -226,15 +226,14 @@ def to_s
end
end
protected
def
requirement_for
(
key
)
return
requirements
[
key
]
if
requirements
.
key?
key
segments
.
each
do
|
segment
|
return
segment
.
regexp
if
segment
.
respond_to?
(
:key
)
&&
segment
.
key
==
key
protected
def
requirement_for
(
key
)
return
requirements
[
key
]
if
requirements
.
key?
key
segments
.
each
do
|
segment
|
return
segment
.
regexp
if
segment
.
respond_to?
(
:key
)
&&
segment
.
key
==
key
end
nil
end
nil
end
end
end
end
actionpack/lib/action_controller/routing/route_set.rb
浏览文件 @
e0513e33
module
ActionController
module
Routing
class
RouteSet
#:nodoc:
class
RouteSet
#:nodoc:
# Mapper instances are used to build routes. The object passed to the draw
# block in config/routes.rb is a Mapper instance.
#
...
...
@@ -432,4 +432,4 @@ def extract_request_environment(request)
end
end
end
end
\ No newline at end of file
end
actionpack/lib/action_controller/routing/routing_ext.rb
浏览文件 @
e0513e33
class
Object
def
to_param
to_s
...
...
actionpack/lib/action_controller/routing/segments.rb
浏览文件 @
e0513e33
...
...
@@ -130,6 +130,7 @@ def local_name
def
extract_value
"
#{
local_name
}
= hash[:
#{
key
}
] && hash[:
#{
key
}
].to_param
#{
"||
#{
default
.
inspect
}
"
if
default
}
"
end
def
value_check
if
default
# Then we know it won't be nil
"
#{
value_regexp
.
inspect
}
=~
#{
local_name
}
"
if
regexp
...
...
@@ -141,6 +142,7 @@ def value_check
"
#{
local_name
}
#{
"&&
#{
value_regexp
.
inspect
}
=~
#{
local_name
}
"
if
regexp
}
"
end
end
def
expiry_statement
"expired, hash = true, options if !expired && expire_on[:
#{
key
}
]"
end
...
...
@@ -175,7 +177,7 @@ def value_regexp
end
def
regexp_chunk
if
regexp
if
regexp
if
regexp_has_modifiers?
"(
#{
regexp
.
to_s
}
)"
else
...
...
@@ -214,7 +216,6 @@ def optionality_implied?
def
regexp_has_modifiers?
regexp
.
options
&
(
Regexp
::
IGNORECASE
|
Regexp
::
EXTENDED
)
!=
0
end
end
class
ControllerSegment
<
DynamicSegment
#:nodoc:
...
...
actionpack/test/controller/routing_test.rb
浏览文件 @
e0513e33
...
...
@@ -834,6 +834,7 @@ def test_time_recognition
puts
"
#{
1
/
per_url
}
url/s
\n\n
"
end
end
def
test_time_generation
n
=
5000
if
RunTimeTests
...
...
actionpack/test/controller/test_test.rb
浏览文件 @
e0513e33
...
...
@@ -64,7 +64,7 @@ def test_html_output
</html>
HTML
end
def
test_xml_output
response
.
content_type
=
"application/xml"
render
:text
=>
<<
XML
...
...
@@ -366,7 +366,7 @@ def test_assert_tag_children_without_content
:children
=>
{
:count
=>
1
,
:only
=>
{
:tag
=>
"img"
}
}
}
}
end
def
test_should_not_impose_childless_html_tags_in_xml
process
:test_xml_output
...
...
@@ -486,7 +486,7 @@ def test_header_properly_reset_after_remote_http_request
assert_nil
@request
.
env
[
'HTTP_X_REQUESTED_WITH'
]
end
def
test_header_properly_reset_after_get_request
def
test_header_properly_reset_after_get_request
get
:test_params
@request
.
recycle!
assert_nil
@request
.
instance_variable_get
(
"@request_method"
)
...
...
@@ -532,15 +532,15 @@ def test_test_uploaded_file
assert_equal
file
.
path
,
file
.
local_path
assert_equal
expected
,
file
.
read
end
def
test_test_uploaded_file_with_binary
filename
=
'mona_lisa.jpg'
path
=
"
#{
FILES_DIR
}
/
#{
filename
}
"
content_type
=
'image/png'
binary_uploaded_file
=
ActionController
::
TestUploadedFile
.
new
(
path
,
content_type
,
:binary
)
assert_equal
File
.
open
(
path
,
READ_BINARY
).
read
,
binary_uploaded_file
.
read
plain_uploaded_file
=
ActionController
::
TestUploadedFile
.
new
(
path
,
content_type
)
assert_equal
File
.
open
(
path
,
READ_PLAIN
).
read
,
plain_uploaded_file
.
read
end
...
...
@@ -549,10 +549,10 @@ def test_fixture_file_upload_with_binary
filename
=
'mona_lisa.jpg'
path
=
"
#{
FILES_DIR
}
/
#{
filename
}
"
content_type
=
'image/jpg'
binary_file_upload
=
fixture_file_upload
(
path
,
content_type
,
:binary
)
assert_equal
File
.
open
(
path
,
READ_BINARY
).
read
,
binary_file_upload
.
read
plain_file_upload
=
fixture_file_upload
(
path
,
content_type
)
assert_equal
File
.
open
(
path
,
READ_PLAIN
).
read
,
plain_file_upload
.
read
end
...
...
@@ -584,7 +584,7 @@ def test_binary_content_works_with_send_file
get
:test_send_file
assert_nothing_raised
(
NoMethodError
)
{
@response
.
binary_content
}
end
protected
def
with_foo_routing
with_routing
do
|
set
|
...
...
@@ -597,7 +597,6 @@ def with_foo_routing
end
end
class
CleanBacktraceTest
<
Test
::
Unit
::
TestCase
def
test_should_reraise_the_same_object
exception
=
Test
::
Unit
::
AssertionFailedError
.
new
(
'message'
)
...
...
@@ -658,7 +657,7 @@ def test_controller_class_can_be_set_manually_not_just_inferred
class
NamedRoutesControllerTest
<
ActionController
::
TestCase
tests
ContentController
def
test_should_be_able_to_use_named_routes_before_a_request_is_done
with_routing
do
|
set
|
set
.
draw
{
|
map
|
map
.
resources
:contents
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录