Allow mounting engines at '/'

Without that commit script_name always become '/', which
results in paths like //posts/1 instead of /posts/1
This commit is contained in:
Piotr Sarnacki 2010-09-25 19:22:32 +02:00
parent 74598fe7e9
commit 22b11a41cc
2 changed files with 78 additions and 17 deletions

@ -511,7 +511,7 @@ def url_for(options)
end
script_name = options.delete(:script_name)
path = (script_name.blank? ? _generate_prefix(options) : script_name).to_s
path = (script_name.blank? ? _generate_prefix(options) : script_name.chomp('/')).to_s
path_options = options.except(*RESERVED_OPTIONS)
path_options = yield(path_options) if block_given?

@ -1,8 +1,23 @@
require 'abstract_unit'
require 'rack/test'
module TestGenerationPrefix
class Post
extend ActiveModel::Naming
def to_param
"1"
end
def self.model_name
klass = "Post"
def klass.name; self end
ActiveModel::Name.new(klass)
end
end
class WithMountedEngine < ActionDispatch::IntegrationTest
require 'rack/test'
include Rack::Test::Methods
class BlogEngine
@ -55,21 +70,6 @@ def self.call(env)
# force draw
RailsApplication.routes
class Post
extend ActiveModel::Naming
def to_param
"1"
end
def self.model_name
klass = "Post"
def klass.name; self end
ActiveModel::Name.new(klass)
end
end
class ::InsideEngineGeneratingController < ActionController::Base
include BlogEngine.routes.url_helpers
include RailsApplication.routes.mounted_helpers
@ -253,4 +253,65 @@ def setup
assert_equal "http://www.example.com/awesome/blog/posts/1", path
end
end
class EngineMountedAtRoot < ActionDispatch::IntegrationTest
include Rack::Test::Methods
class BlogEngine
def self.routes
@routes ||= begin
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
match "/posts/:id", :to => "posts#show", :as => :post
end
routes
end
end
def self.call(env)
env['action_dispatch.routes'] = routes
routes.call(env)
end
end
class RailsApplication
def self.routes
@routes ||= begin
routes = ActionDispatch::Routing::RouteSet.new
routes.draw do
mount BlogEngine => "/"
end
routes
end
end
def self.call(env)
env['action_dispatch.routes'] = routes
routes.call(env)
end
end
# force draw
RailsApplication.routes
class ::PostsController < ActionController::Base
include BlogEngine.routes.url_helpers
include RailsApplication.routes.mounted_helpers
def show
render :text => post_path(:id => params[:id])
end
end
def app
RailsApplication
end
test "generating path inside engine" do
get "/posts/1"
assert_equal "/posts/1", last_response.body
end
end
end