Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Multiple public folders, single rails installation

I have a rails application I would like to use for multiple sites, each with different designs.

I would like to change the rails installation /public directory to something else (dynamically eventually). However, I have run into a problem (bug?) changing directories...

In my application.rb file I change the paths.public path to something other than "public" (let's say "site_one"). Here is the code:

puts paths.public.paths
paths.public = "site_one"
puts paths.public.paths

The two "puts" commands are for debugging. Now run "rails s" and you will see:

/home/macklin/app/public
/home/macklin/app/site_one

This verifies the path is changed correctly. However, shortly afterward, rails throws the following error (let me know if you need the full trace):

Exiting
/usr/lib/ruby/gems/1.8/gems/railties-3.0.3/lib/rails/paths.rb:16:in `method_missing': undefined method `javascripts' for #<Rails::Paths::Path:0x7f422bd76f58> (NoMethodError) from /usr/lib/ruby/gems/1.8/gems/actionpack-3.0.3/lib/action_controller/railtie.rb:47

My guess is it cannot find the javascripts directory even though it is clearly sitting in the "site_one" folder.

Does anyone know why I am getting this?

like image 540
Macklin Avatar asked Jan 05 '11 02:01

Macklin


2 Answers

I know this question is pretty old, but I think I found an answer for this in Rails 4.2.

You just simply have to put this line in your config/application.rb:

middleware.use ::ActionDispatch::Static, "#{Rails.root}/another_public_folder_name", index: 'index', headers: config.static_cache_control

This makes all files in /another_public_folder_name to be served by Rails.

This is the way Rails use to setup the standard /public folder. I found it checking the sources:

https://github.com/rails/rails/blob/52ce6ece8c8f74064bb64e0a0b1ddd83092718e1/railties/lib/rails/application/default_middleware_stack.rb#L24

like image 119
ProGM Avatar answered Oct 24 '22 12:10

ProGM


Duh. Just add 2 more rules for stylesheets and javascripts (I guess they get wiped when you change the parent path)

paths.public.stylesheets = "site_one/stylesheets"
paths.public.javascripts = "site_one/javascripts"
like image 24
Macklin Avatar answered Oct 24 '22 12:10

Macklin