Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
张重言
rails
提交
2fbd6f46
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,发现更多精彩内容 >>
提交
2fbd6f46
编写于
12月 01, 2009
作者:
J
Joshua Peek
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Simply track controller namespaces instead of a complete list of
possible controllers to route to
上级
7fe19d41
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
22 addition
and
47 deletion
+22
-47
actionpack/lib/action_dispatch/routing.rb
actionpack/lib/action_dispatch/routing.rb
+16
-43
actionpack/lib/action_dispatch/routing/route_set.rb
actionpack/lib/action_dispatch/routing/route_set.rb
+6
-4
未找到文件。
actionpack/lib/action_dispatch/routing.rb
浏览文件 @
2fbd6f46
...
...
@@ -265,6 +265,7 @@ module Routing
SEPARATORS
=
%w( / . ? )
HTTP_METHODS
=
[
:get
,
:head
,
:post
,
:put
,
:delete
,
:options
]
CONTROLLER_REGEXP
=
/[_a-zA-Z0-9]+/
# The root paths which may contain controller files
mattr_accessor
:controller_paths
...
...
@@ -277,7 +278,11 @@ module Helpers
class
<<
self
def
controller_constraints
@controller_constraints
||=
Regexp
.
union
(
*
possible_controllers
.
collect
{
|
n
|
Regexp
.
escape
(
n
)
})
@controller_constraints
||=
begin
source
=
controller_namespaces
.
map
{
|
ns
|
"
#{
Regexp
.
escape
(
ns
)
}
/
#{
CONTROLLER_REGEXP
.
source
}
"
}
source
<<
CONTROLLER_REGEXP
.
source
Regexp
.
compile
(
source
.
sort
.
reverse
.
join
(
'|'
))
end
end
def
clear_controller_cache!
...
...
@@ -285,57 +290,25 @@ def clear_controller_cache!
end
private
# Returns the array of controller names currently available to ActionController::Routing.
def
possible_controllers
possible_controllers
=
[]
def
controller_namespaces
namespaces
=
Set
.
new
# Find any
controller classe
s already in memory
# Find any
nested controller
s already in memory
ActionController
::
Base
.
subclasses
.
each
do
|
klass
|
controller_name
=
klass
.
underscore
controller_name
.
gsub!
(
/_controller\Z/
,
''
)
possible_controllers
<<
controller_name
namespaces
<<
controller_name
.
split
(
'/'
)[
0
...-
1
].
join
(
'/'
)
end
# Find controllers in controllers/ directory
paths
=
controller_paths
.
select
{
|
path
|
File
.
directory?
(
path
)
&&
path
!=
"."
}
seen_paths
=
Hash
.
new
{
|
h
,
k
|
h
[
k
]
=
true
;
false
}
normalize_paths
(
paths
).
each
do
|
load_path
|
# Find namespaces in controllers/ directory
controller_paths
.
each
do
|
load_path
|
load_path
=
File
.
expand_path
(
load_path
)
Dir
[
"
#{
load_path
}
/**/*_controller.rb"
].
collect
do
|
path
|
next
if
seen_paths
[
path
.
gsub
(
%r{^
\.
[/
\\
]}
,
""
)]
controller_name
=
path
[(
load_path
.
length
+
1
)
..-
1
]
controller_name
.
gsub!
(
/_controller\.rb\Z/
,
''
)
possible_controllers
<<
controller_name
namespaces
<<
File
.
dirname
(
path
).
sub
(
/
#{
load_path
}
\/?/
,
''
)
end
end
# remove duplicates
possible_controllers
.
uniq!
possible_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.
def
normalize_paths
(
paths
)
# do the hokey-pokey of path normalization...
paths
=
paths
.
collect
do
|
path
|
path
=
path
.
gsub
(
"//"
,
"/"
)
.
# replace double / chars with a single
gsub
(
"
\\\\
"
,
"
\\
"
)
.
# replace double \ chars with a single
gsub
(
%r{(.)[
\\
/]$}
,
'\1'
)
# drop final / or \ if path ends with it
# eliminate .. paths where possible
re
=
%r{[^/
\\
]+[/
\\
]
\.\.
[/
\\
]}
path
.
gsub!
(
re
,
""
)
while
path
.
match
(
re
)
path
end
# start with longest path, first
paths
=
paths
.
uniq
.
sort_by
{
|
path
|
-
path
.
length
}
namespaces
.
delete
(
''
)
namespaces
end
end
end
...
...
actionpack/lib/action_dispatch/routing/route_set.rb
浏览文件 @
2fbd6f46
...
...
@@ -27,11 +27,13 @@ def call(env)
end
end
unless
controller
=
controller
(
params
)
return
[
417
,
{},
[]]
end
if
env
[
'action_controller.recognize'
]
controller
(
params
)
[
200
,
{},
params
]
else
controller
=
controller
(
params
)
controller
.
action
(
params
[
:action
]).
call
(
env
)
end
end
...
...
@@ -42,8 +44,8 @@ def controller(params)
controller
=
"
#{
params
[
:controller
].
camelize
}
Controller"
ActiveSupport
::
Inflector
.
constantize
(
controller
)
end
rescue
NameError
=>
e
raise
ActionController
::
RoutingError
,
e
.
message
rescue
NameError
nil
end
def
merge_default_action!
(
params
)
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录