URI rewriting to determine a controller based on an action name
This commit is contained in:
parent
12a34823a8
commit
9d90901cd0
|
@ -1,4 +1,5 @@
|
||||||
require 'application'
|
require 'application'
|
||||||
|
|
||||||
class FileController < ApplicationController
|
class FileController < ApplicationController
|
||||||
|
|
||||||
layout 'default', :except => [:rss_feed, :rss_with_headlines, :tex, :export_tex, :export_html]
|
layout 'default', :except => [:rss_feed, :rss_with_headlines, :tex, :export_tex, :export_html]
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
# In Instiki URLs are mapped to the ActionPack actions, possibly performed on a particular
|
# In Instiki URLs are mapped to the ActionPack actions, possibly performed on a particular
|
||||||
# web (sub-wiki) and page within that web.
|
# web (sub-wiki) and page within that web.
|
||||||
#
|
#
|
||||||
# 1. Controller is always 'wiki'
|
# 1. Controller is determined by action name (default is 'wiki')
|
||||||
# 2. '/name1/' maps to action 'name1', unspecified web
|
# 2. '/name1/' maps to action 'name1', unspecified web
|
||||||
# Example: http://localhost/new_system/
|
# Example: http://localhost/new_system/
|
||||||
# 3. Special case of above, URI '/wiki/' maps to action 'index', because Rails sets this address
|
# 3. Special case of above, URI '/wiki/' maps to action 'index', because Rails sets this address
|
||||||
|
@ -24,6 +24,16 @@ require 'dispatcher'
|
||||||
class DispatchServlet
|
class DispatchServlet
|
||||||
|
|
||||||
def self.parse_uri(path)
|
def self.parse_uri(path)
|
||||||
|
result = parse_path(path)
|
||||||
|
if result
|
||||||
|
result[:controller] = ActionMapper.map_to_controller(result[:action])
|
||||||
|
result
|
||||||
|
else
|
||||||
|
false
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def self.parse_path(path)
|
||||||
ApplicationController.logger.debug "Parsing URI '#{path}'"
|
ApplicationController.logger.debug "Parsing URI '#{path}'"
|
||||||
component = '([-_a-zA-Z0-9]+)'
|
component = '([-_a-zA-Z0-9]+)'
|
||||||
page_name = '(.*)'
|
page_name = '(.*)'
|
||||||
|
@ -48,6 +58,19 @@ class DispatchServlet
|
||||||
line
|
line
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
class ActionMapper
|
||||||
|
|
||||||
|
@@action_to_controller_map = {
|
||||||
|
'file' => 'file',
|
||||||
|
'pic' => 'file'
|
||||||
|
}
|
||||||
|
|
||||||
|
def self.map_to_controller(action)
|
||||||
|
@@action_to_controller_map[action] || 'wiki'
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -72,5 +72,21 @@ class UrlRewritingHackTest < Test::Unit::TestCase
|
||||||
assert_equal 'http://test.host/',
|
assert_equal 'http://test.host/',
|
||||||
ur.rewrite(:controller => 'wiki')
|
ur.rewrite(:controller => 'wiki')
|
||||||
end
|
end
|
||||||
|
|
||||||
|
def test_controller_mapping
|
||||||
|
request = ActionController::TestRequest.new
|
||||||
|
ur = ActionController::UrlRewriter.new(request, 'wiki', 'show')
|
||||||
|
|
||||||
|
assert_equal 'http://test.host/file',
|
||||||
|
ur.rewrite(:controller => 'file', :action => 'file')
|
||||||
|
assert_equal 'http://test.host/pic/abc.jpg',
|
||||||
|
ur.rewrite(:controller => 'file', :action => 'pic', :id => 'abc.jpg')
|
||||||
|
assert_equal 'http://test.host/web/pic/abc.jpg',
|
||||||
|
ur.rewrite(:web => 'web', :controller => 'file', :action => 'pic', :id => 'abc.jpg')
|
||||||
|
|
||||||
|
# default option is wiki
|
||||||
|
assert_equal 'http://test.host/unknown_action',
|
||||||
|
ur.rewrite(:controller => 'wiki', :action => 'unknown_action')
|
||||||
|
end
|
||||||
|
|
||||||
end
|
end
|
Loading…
Reference in a new issue