diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2005-03-20 22:02:22 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2005-03-20 22:02:22 +0000 |
commit | a61360688cd0e1f43f523866384d0d0796a4ea73 (patch) | |
tree | dfa09275f2165b1af8363642b67d85b5702cf793 /actionpack | |
parent | ee8d110068e958b400987b5f224e14e292fd0558 (diff) | |
download | rails-a61360688cd0e1f43f523866384d0d0796a4ea73.tar.gz rails-a61360688cd0e1f43f523866384d0d0796a4ea73.tar.bz2 rails-a61360688cd0e1f43f523866384d0d0796a4ea73.zip |
Changed .htaccess to allow dispatch.* to be called from a sub-directory as part of the push with Action Pack to make Rails work on non-vhost setups #826 [Nicholas Seckar/Tobias Luetke] Fixed routing and helpers to make Rails work on non-vhost setups #826 [Nicholas Seckar/Tobias Luetke]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@945 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'actionpack')
-rw-r--r-- | actionpack/CHANGELOG | 2 | ||||
-rwxr-xr-x | actionpack/lib/action_controller/request.rb | 15 | ||||
-rw-r--r-- | actionpack/lib/action_controller/url_rewriter.rb | 7 | ||||
-rw-r--r-- | actionpack/lib/action_view/helpers/asset_tag_helper.rb | 26 | ||||
-rw-r--r-- | actionpack/test/controller/request_test.rb | 34 | ||||
-rw-r--r-- | actionpack/test/template/asset_tag_helper_test.rb | 87 | ||||
-rw-r--r-- | actionpack/test/template/url_helper_test.rb | 22 |
7 files changed, 153 insertions, 40 deletions
diff --git a/actionpack/CHANGELOG b/actionpack/CHANGELOG index 96895a9529..726b2c19c9 100644 --- a/actionpack/CHANGELOG +++ b/actionpack/CHANGELOG @@ -1,5 +1,7 @@ *SVN* +* Fixed routing and helpers to make Rails work on non-vhost setups #826 [Nicholas Seckar/Tobias Luetke] + * Added a much improved Flash module that allows for finer-grained control on expiration and allows you to flash the current action #839 [Caio Chassot]. Example of flash.now: class SomethingController < ApplicationController diff --git a/actionpack/lib/action_controller/request.rb b/actionpack/lib/action_controller/request.rb index 429b3b9017..6e73a69ed7 100755 --- a/actionpack/lib/action_controller/request.rb +++ b/actionpack/lib/action_controller/request.rb @@ -84,9 +84,20 @@ module ActionController def ssl? protocol == 'https://' end - + + # returns the interpreted path to requested resource after + # all the installation directory of this application was taken into account def path - request_uri ? request_uri.split('?').first : '' + path = request_uri ? request_uri.split('?').first : '' + + # cut off the part of the url which leads to the installation directory of this app + path[relative_url_root.length..-1] + end + + # returns the path minus the web server relative + # installation directory + def relative_url_root + File.dirname(env["SCRIPT_NAME"].to_s).gsub /(^\.$|^\/$)/, '' end def port diff --git a/actionpack/lib/action_controller/url_rewriter.rb b/actionpack/lib/action_controller/url_rewriter.rb index bbfa6009a4..3e6ccf7a06 100644 --- a/actionpack/lib/action_controller/url_rewriter.rb +++ b/actionpack/lib/action_controller/url_rewriter.rb @@ -2,13 +2,13 @@ module ActionController # Rewrites URLs for Base.redirect_to and Base.url_for in the controller. class UrlRewriter #:nodoc: - RESERVED_OPTIONS = [:anchor, :params, :only_path, :host, :protocol] + RESERVED_OPTIONS = [:anchor, :params, :only_path, :host, :protocol, :application_prefix] def initialize(request, parameters) @request, @parameters = request, parameters @rewritten_path = @request.path ? @request.path.dup : "" end - def rewrite(options = {}) + def rewrite(options = {}) rewrite_url(rewrite_path(options), options) end @@ -20,11 +20,12 @@ module ActionController private def rewrite_url(path, options) + rewritten_url = "" rewritten_url << (options[:protocol] || @request.protocol) unless options[:only_path] rewritten_url << (options[:host] || @request.host_with_port) unless options[:only_path] - rewritten_url << options[:application_prefix] if options[:application_prefix] + rewritten_url << (options[:application_prefix] || @request.relative_url_root) rewritten_url << path rewritten_url << "##{options[:anchor]}" if options[:anchor] diff --git a/actionpack/lib/action_view/helpers/asset_tag_helper.rb b/actionpack/lib/action_view/helpers/asset_tag_helper.rb index 6328ff6f71..f6159e5246 100644 --- a/actionpack/lib/action_view/helpers/asset_tag_helper.rb +++ b/actionpack/lib/action_view/helpers/asset_tag_helper.rb @@ -33,8 +33,7 @@ module ActionView # <script language="JavaScript" type="text/javascript" src="/elsewhere/cools.js"></script> def javascript_include_tag(*sources) sources.collect { |source| - source = "/javascripts/#{source}" unless source.include?("/") - source = "#{source}.js" unless source.include?(".") + source = compute_public_path(source, 'javascripts', 'js') content_tag("script", "", "language" => "JavaScript", "type" => "text/javascript", "src" => source) }.join("\n") end @@ -49,8 +48,7 @@ module ActionView # <link href="/css/stylish.css" media="screen" rel="Stylesheet" type="text/css" /> def stylesheet_link_tag(*sources) sources.collect { |source| - source = "/stylesheets/#{source}" unless source.include?("/") - source = "#{source}.css" unless source.include?(".") + source = compute_public_path(source, 'stylesheets', 'css') tag("link", "rel" => "Stylesheet", "type" => "text/css", "media" => "screen", "href" => source) }.join("\n") end @@ -64,13 +62,11 @@ module ActionView # * full path, like "/my_images/image.gif" # * file name, like "rss.gif", that gets expanded to "/images/rss.gif" # * file name without extension, like "logo", that gets expanded to "/images/logo.png" - def image_tag(src, options = {}) + def image_tag(source, options = {}) options.symbolize_keys - - options.update({ :src => src.include?("/") ? src : "/images/#{src}" }) - options[:src] += ".png" unless options[:src].include?(".") - - options[:alt] ||= src.split("/").last.split(".").first.capitalize + + options[:src] = compute_public_path(source, 'images', 'png') + options[:alt] ||= source.split("/").last.split(".").first.capitalize if options[:size] options[:width], options[:height] = options[:size].split("x") @@ -79,6 +75,16 @@ module ActionView tag("img", options) end + + private + + def compute_public_path(source, dir, ext) + source = "/#{dir}/#{source}" unless source.include?("/") + source = "#{source}.#{ext}" unless source.include?(".") + source = "#{@request.relative_url_root}#{source}" + source + end + end end end diff --git a/actionpack/test/controller/request_test.rb b/actionpack/test/controller/request_test.rb index 54ff84151a..09c1dd7ce3 100644 --- a/actionpack/test/controller/request_test.rb +++ b/actionpack/test/controller/request_test.rb @@ -32,6 +32,23 @@ class RequestTest < Test::Unit::TestCase assert_equal ":8080", @request.port_string end + def test_relative_url_root + @request.env['SCRIPT_NAME'] = nil + assert_equal "", @request.relative_url_root + + @request.env['SCRIPT_NAME'] = "/dispatch.cgi" + assert_equal "", @request.relative_url_root + + @request.env['SCRIPT_NAME'] = "/myapp.rb" + assert_equal "", @request.relative_url_root + + @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi" + assert_equal "/hieraki", @request.relative_url_root + + @request.env['SCRIPT_NAME'] = "/collaboration/hieraki/dispatch.cgi" + assert_equal "/collaboration/hieraki", @request.relative_url_root + end + def test_request_uri @request.set_REQUEST_URI "http://www.rubyonrails.org/path/of/some/uri?mapped=1" assert_equal "/path/of/some/uri?mapped=1", @request.request_uri @@ -52,7 +69,24 @@ class RequestTest < Test::Unit::TestCase @request.set_REQUEST_URI "/?m=b" assert_equal "/?m=b", @request.request_uri assert_equal "/", @request.path + + @request.set_REQUEST_URI "/" + @request.env['SCRIPT_NAME'] = "/dispatch.cgi" + assert_equal "/", @request.request_uri + assert_equal "/", @request.path + + @request.set_REQUEST_URI "/hieraki/" + @request.env['SCRIPT_NAME'] = "/hieraki/dispatch.cgi" + assert_equal "/hieraki/", @request.request_uri + assert_equal "/", @request.path + + @request.set_REQUEST_URI "/collaboration/hieraki/books/edit/2" + @request.env['SCRIPT_NAME'] = "/collaboration/hieraki/dispatch.cgi" + assert_equal "/collaboration/hieraki/books/edit/2", @request.request_uri + assert_equal "/books/edit/2", @request.path + end + def test_host_with_port @request.env['HTTP_HOST'] = "rubyonrails.org:8080" diff --git a/actionpack/test/template/asset_tag_helper_test.rb b/actionpack/test/template/asset_tag_helper_test.rb index 896d843165..d51d0075b0 100644 --- a/actionpack/test/template/asset_tag_helper_test.rb +++ b/actionpack/test/template/asset_tag_helper_test.rb @@ -8,11 +8,19 @@ class AssetTagHelperTest < Test::Unit::TestCase def setup @controller = Class.new do + def url_for(options, *parameters_for_method_reference) "http://www.example.com" end - end - @controller = @controller.new + + end.new + + @request = Class.new do + def relative_url_root + "" + end + end.new + end AutoDiscoveryToTag = { @@ -31,6 +39,74 @@ class AssetTagHelperTest < Test::Unit::TestCase %(stylesheet_link_tag("random.styles", "/css/stylish")) => %(<link href="/stylesheets/random.styles" media="screen" rel="Stylesheet" type="text/css" />\n<link href="/css/stylish.css" media="screen" rel="Stylesheet" type="text/css" />) } + ImageLinkToTag = { + %(image_tag("xml")) => %(<img alt="Xml" src="/images/xml.png" />), + %(image_tag("rss", :alt => "rss syndication")) => %(<img alt="rss syndication" src="/images/rss.png" />), + %(image_tag("gold", :size => "45x70")) => %(<img alt="Gold" height="70" src="/images/gold.png" width="45" />), + } + + def test_auto_discovery + AutoDiscoveryToTag.each { |method, tag| assert_equal(tag, eval(method)) } + end + + def test_javascript_include + JavascriptIncludeToTag.each { |method, tag| assert_equal(tag, eval(method)) } + end + + def test_style_link + StyleLinkToTag.each { |method, tag| assert_equal(tag, eval(method)) } + end + + def test_image_tag + ImageLinkToTag.each { |method, tag| assert_equal(tag, eval(method)) } + end + +end + +class AssetTagHelperNonVhostTest < Test::Unit::TestCase + include ActionView::Helpers::TagHelper + include ActionView::Helpers::UrlHelper + include ActionView::Helpers::AssetTagHelper + + def setup + @controller = Class.new do + + def url_for(options, *parameters_for_method_reference) + "http://www.example.com/calloboration/hieraki" + end + + end.new + + @request = Class.new do + def relative_url_root + "/calloboration/hieraki" + end + end.new + + end + + AutoDiscoveryToTag = { + %(auto_discovery_link_tag(:rss, :action => "feed")) => %(<link href="http://www.example.com/calloboration/hieraki" rel="alternate" title="RSS" type="application/rss+xml" />), + %(auto_discovery_link_tag(:atom)) => %(<link href="http://www.example.com/calloboration/hieraki" rel="alternate" title="ATOM" type="application/atom+xml" />), + %(auto_discovery_link_tag) => %(<link href="http://www.example.com/calloboration/hieraki" rel="alternate" title="RSS" type="application/rss+xml" />), + } + + JavascriptIncludeToTag = { + %(javascript_include_tag("xmlhr")) => %(<script language="JavaScript" src="/calloboration/hieraki/javascripts/xmlhr.js" type="text/javascript"></script>), + %(javascript_include_tag("common.javascript", "/elsewhere/cools")) => %(<script language="JavaScript" src="/calloboration/hieraki/javascripts/common.javascript" type="text/javascript"></script>\n<script language="JavaScript" src="/calloboration/hieraki/elsewhere/cools.js" type="text/javascript"></script>), + } + + StyleLinkToTag = { + %(stylesheet_link_tag("style")) => %(<link href="/calloboration/hieraki/stylesheets/style.css" media="screen" rel="Stylesheet" type="text/css" />), + %(stylesheet_link_tag("random.styles", "/css/stylish")) => %(<link href="/calloboration/hieraki/stylesheets/random.styles" media="screen" rel="Stylesheet" type="text/css" />\n<link href="/calloboration/hieraki/css/stylish.css" media="screen" rel="Stylesheet" type="text/css" />) + } + + ImageLinkToTag = { + %(image_tag("xml")) => %(<img alt="Xml" src="/calloboration/hieraki/images/xml.png" />), + %(image_tag("rss", :alt => "rss syndication")) => %(<img alt="rss syndication" src="/calloboration/hieraki/images/rss.png" />), + %(image_tag("gold", :size => "45x70")) => %(<img alt="Gold" height="70" src="/calloboration/hieraki/images/gold.png" width="45" />), + } + def test_auto_discovery AutoDiscoveryToTag.each { |method, tag| assert_equal(tag, eval(method)) } end @@ -44,6 +120,11 @@ class AssetTagHelperTest < Test::Unit::TestCase end def test_image_tag - assert_equal %(<img alt="Gold" height="70" src="/images/gold.png" width="45" />), image_tag("gold", :size => "45x70") + assert_equal %(<img alt="Gold" height="70" src="/calloboration/hieraki/images/gold.png" width="45" />), image_tag("gold", :size => "45x70") + end + + def test_image_tag + ImageLinkToTag.each { |method, tag| assert_equal(tag, eval(method)) } end + end
\ No newline at end of file diff --git a/actionpack/test/template/url_helper_test.rb b/actionpack/test/template/url_helper_test.rb index 8e0016f0fd..32b98eb5dc 100644 --- a/actionpack/test/template/url_helper_test.rb +++ b/actionpack/test/template/url_helper_test.rb @@ -36,28 +36,6 @@ class UrlHelperTest < Test::Unit::TestCase ) end - def test_link_image_to - assert_equal( - "<a href=\"http://www.example.com\"><img alt=\"Rss\" border=\"0\" height=\"45\" src=\"/images/rss.png\" width=\"30\" /></a>", - link_image_to("rss", "http://www.example.com", "size" => "30x45", "border" => "0") - ) - - assert_equal( - "<a href=\"http://www.example.com\"><img alt=\"Rss\" border=\"0\" height=\"45\" src=\"/images/rss.png\" width=\"30\" /></a>", - link_to(image_tag("rss", :size => "30x45", :border => 0), "http://www.example.com") - ) - - assert_equal( - "<a class=\"admin\" href=\"http://www.example.com\"><img alt=\"Feed\" height=\"45\" src=\"/images/rss.gif\" width=\"30\" /></a>", - link_image_to("rss.gif", "http://www.example.com", "size" => "30x45", "alt" => "Feed", "class" => "admin") - ) - - assert_equal link_image_to("rss", "http://www.example.com", "size" => "30x45"), - link_image_to("rss", "http://www.example.com", :size => "30x45") - assert_equal link_image_to("rss.gif", "http://www.example.com", "size" => "30x45", "alt" => "Feed", "class" => "admin"), - link_image_to("rss.gif", "http://www.example.com", :size => "30x45", :alt => "Feed", :class => "admin") - end - def test_link_to_unless assert_equal "Showing", link_to_unless(true, "Showing", :action => "show", :controller => "weblog") assert "<a href=\"http://www.example.com\">Listing</a>", link_to_unless(false, "Listing", :action => "list", :controller => "weblog") |