I’m building a website using AngularJS and Rails. The HTML files that I’m using for templates are stored under /app/assets/templates and each time I update a route or change something inside of a nested partial inside of a template I need to “touch” the highest level file in the /app/assets/templates directory for the html file I’m changing.
So if I have a page “edit.html” which loads a partial “_form.html” then whenever I update a route or change something in _form.html I need to make sure that edit.html is touched.
This is annoying and very finicky. Is there any way to inform the asset pipeline/sprockets to avoid caching for the app/assets/templates directory?
The best solution I’ve found to this is not to use the asset pipeline for HTML template files.
Instead make a controller called
TemplatesControllerand create only one action.Then map all template URLs to that using a route such as:
Then move all the template files into
app/views/templatesThen inside the controller, setup the following:
This way all of your template files will be served from the controller and then will be cached into public/templates. To avoid cache problems, you can create a timestamp path into the template route so that your cached files are delivered with a version:
This way you can have a new timestamp each time you upload the website and you can store the templates folder anywhere you like. You can even store the templates folder on S3 and have an assets URL for that. Then wherever your template files are addressed, you can use a custom asset method:
Where:
Then just make the asset redirect to the Rails server if it’s not found and it will be generated. Or all template files can be pre-generated once uploaded.