Question

This question came about because the cells gem specifies template directories using File.join('app','cells'). That works fine until you run Rails as a daemon (scripts/server -d). The daemon switches directories to / which leaves the cells template paths pointing to the wrong absolute path.

My solution was to set the default paths to File.join(RAILS_ROOT, 'app', 'cells'). This works in Rails, but the unit tests for the plugin fail because RAILS_ROOT isn't defined. Using File.join(File.dirname(__FILE__),'..' ... also works but requires about 6 levels of '..' which seems wrong.

So my question is what is the proper way to specify the path to a directory under 'app' in a Rails plugin? Or is there something else wrong that would cause daemonizing Rails to fail to find the relative paths?

Was it helpful?

Solution

I suggest moving your changes out of the plugin and into an initializer. In the initializer override the method that uses File.join('app','cells'). This has several benefits.

  1. You are not modifying third-party code directly so you are more likely not to have to worry about re-applying changes on an upgrade.
  2. By not modifying the plugin itself the plugin unit tests will still pass.
  3. You are able to use RAILS_ROOT which I think is the right solution.

OTHER TIPS

For those who had trouble deciphering this answer, here is what worked for me:

Create a file config/initializers/cells.rb

in it put:

Cell::Base.view_paths=[
  File.join(RAILS_ROOT, 'app', 'cells'),
  File.join(RAILS_ROOT, 'app', 'cells', 'layouts')
]

Hope this helps

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top