Best practice for running an app in subdirectory

I seem to be misunderstanding something very basic in trying to run my app in a subdirectory. Remarkably, all my restful routes work flawlessly. Everything outside of rails routing conventions is what's giving me problems. My app is using mod_rails and I've got it sym- linked to www.domain.com/myapp (for example).

My application layout includes this line in the head section of the html:

<link rel="shortcut icon" type="image/ico" href="/favicon.ico" />

And of course that doesn't work...it can't find my app's favicon, instead pointing to the root of my domain to look for it. Basically, you can't reference anything with a leading slash if you're running the app in a subdirectory. Manual routing like this needs to know the "url root", I'm thinking. So I found this setting:

config.action_controller.relative_url_root

Rails guides says that it can be used to tell Rails that you are deploying to a subdirectory. The default is ENV ['RAILS_RELATIVE_URL_ROOT']. Ok, so I added that config setting to my config/environment.rb and nothing changed. What exactly does this action_controller setting do and how do you use it?

The other thing I tried (which worked but it's ugly) was to set the RAILS_RELATIVE_URL_ROOT env variable in config/environment.rb to my app's root (/myapp):

RAILS_RELATIVE_URL_ROOT = '/myapp'

Then in my application layout, I accessed the app's favicon like this:

<link rel="shortcut icon" type="image/ico" href="< %=RAILS_RELATIVE_URL_ROOT%>/favicon.ico" />

And same thing with an image:

<img src="<%=RAILS_RELATIVE_URL_ROOT%>/images/avatar.gif" alt="" style="border: 1px solid #ddd; padding: 3px; margin: 0 10px 0 0;"/>

So everywhere I need to reference a path outside of rails' named routes, I have to insert this env variable? That can't be best practice! Or is it?

Thanks for any help!

Well the image issue is easily corrected...use the view helper for image tags:

<%=image_tag("avatar.gif", :alt => "", :style => "border: 1px solid #ddd; padding: 3px; margin: 0 10px 0 0;")%>

That way I'm able to let Rails handle the application pathing just like the restful routes...and no mention of any env variable.

But that won't work for the favicon which sits in public/ so I'm still tied down to having to include that env variable in the view like that?

And the question I have about the action controller relative_url_root config option...what does that do exactly and how do I use it? Or do I need to use it? My app is sitting in a subdirectory and it's working without that settting (I'm still declaring RAILS_RELATIVE_URL_ROOT though to get the favicon working).

Thanks for any help.

relative_url_root just.... refers to the app's relative url root. It's prepended to the path returned by in javascript_include_tag, image_tag, and such. You can access this variable in your helpers/ whatever via ActionController::Base.relative_url_root.

Thanks pharrington. Whenever I need explicit access to the relative root, I call a helper method in my application_helper to return that config variable. That's exactly what I needed. Thanks again.