1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00

Fix a bug in ActionDispatch::Static where Rails cannot find assets if started in another directory which is not the RAILS_ROOT.

This commit is contained in:
José Valim 2010-04-08 12:52:37 +02:00
parent 336cb3c0bf
commit 4e92134dfa
6 changed files with 21 additions and 7 deletions

View file

@ -38,22 +38,22 @@ module ActionController #:nodoc:
extend ActiveSupport::Concern
included do
@@page_cache_directory = defined?(Rails.public_path) ? Rails.public_path : ""
##
# :singleton-method:
# The cache directory should be the document root for the web server and is set using <tt>Base.page_cache_directory = "/document/root"</tt>.
# For Rails, this directory has already been set to Rails.public_path (which is usually set to <tt>RAILS_ROOT + "/public"</tt>). Changing
# this setting can be useful to avoid naming conflicts with files in <tt>public/</tt>, but doing so will likely require configuring your
# web server to look in the new location for cached files.
@@page_cache_directory = ''
cattr_accessor :page_cache_directory
@@page_cache_extension = '.html'
##
# :singleton-method:
# Most Rails requests do not have an extension, such as <tt>/weblog/new</tt>. In these cases, the page caching mechanism will add one in
# order to make it easy for the cached files to be picked up properly by the web server. By default, this cache extension is <tt>.html</tt>.
# If you want something else, like <tt>.php</tt> or <tt>.shtml</tt>, just set Base.page_cache_extension. In cases where a request already has an
# extension, such as <tt>.xml</tt> or <tt>.rss</tt>, page caching will not add an extension. This allows it to work well with RESTful apps.
@@page_cache_extension = '.html'
cattr_accessor :page_cache_extension
end

View file

@ -32,8 +32,6 @@ module ActionController
def rescue_action(env)
raise env["action_dispatch.rescue.exception"]
end
self.page_cache_directory = defined?(Rails.public_path) ? Rails.public_path : ""
end
# For old tests

View file

@ -44,6 +44,12 @@ module ActionController
ActiveSupport.on_load(:action_controller) { self.logger ||= Rails.logger }
end
initializer "action_controller.page_cache_directory" do
ActiveSupport.on_load(:action_controller) do
self.page_cache_directory = Rails.public_path
end
end
initializer "action_controller.set_configs" do |app|
paths = app.config.paths
ac = app.config.action_controller

View file

@ -92,11 +92,12 @@ module Rails
end
def public_path
@@public_path ||= self.root ? File.join(self.root, "public") : "public"
application && application.paths.public.to_a.first
end
def public_path=(path)
@@public_path = path
ActiveSupport::Deprecation.warn "Setting Rails.public_path= is deprecated. " <<
"Please set paths.public = in config/application.rb instead.", caller
end
end
end

View file

@ -137,7 +137,7 @@ module Rails
def default_middleware_stack
ActionDispatch::MiddlewareStack.new.tap do |middleware|
middleware.use('::ActionDispatch::Static', lambda { Rails.public_path }, :if => lambda { serve_static_assets })
middleware.use('::ActionDispatch::Static', lambda { paths.public.to_a.first }, :if => lambda { serve_static_assets })
middleware.use('::Rack::Lock', :if => lambda { !allow_concurrency })
middleware.use('::Rack::Runtime')
middleware.use('::Rails::Rack::Logger')

View file

@ -184,6 +184,15 @@ module ApplicationTests
end
end
test "config.paths.public sets Rails.public_path" do
add_to_config <<-RUBY
config.paths.public = "somewhere"
RUBY
require "#{app_path}/config/application"
assert_equal File.join(app_path, "somewhere"), Rails.public_path
end
def make_basic_app
require "rails"
require "action_controller/railtie"