What is the proper way to specify a path to 'app' in a Rails plugin?
-
21-09-2019 - |
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?
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.
- 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.
- By not modifying the plugin itself the plugin unit tests will still pass.
- 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