Sometimes in the life of a hybrid Rails-Javascript app you may want to do something unique: have a config file written in YAML available to you in your Javascript code.
A simple trick will make Sprockets, the Asset Pipeline in Rails 4+, do this automagically for you. This example comes from https://github.com/rails/sprockets/issues/366
I’ve created an example app that you can read the source or see live demo here.
First, we’ll need to create a special hook for Sprockets called “depend on config”. Create a file at lib/process_depend_on_config.rb
Sprockets::DirectiveProcessor.class_eval do
def process_depend_on_config_directive(file)
path = File.expand_path(file, “#{Rails.root}/config”)
context.depend_on(path)
end
end
Now, in your Sprockets-managed Javascript, use this directive before you include Ruby evaluation inside of javacript
assets/javascripts/pull_yaml_into_json.js.erb
ExampleApp = {};
ExampleApp.MyConfigs = {
getConfigs: function() {
var mySettings = <%= YAML.load_file(“config/my_configs_in.yml”).to_json %>;
return mySettings;
}
};
Finally, for demonstration purposes, create a file at config/my_config_in.yml, you actually have the YAML configuration you want to port from Ruby to JSON, something like
world: 12345
country: 678
state: 90
city: 11
The depends on config directive tells Sprockets to invalidate the cache for the resulting JS file when the YAML file changes, hence why it is needed here.
Voila! Your Ruby-based output (here, a YAML config but theoretically could be anything) is now included in each build during the Sprockets compilation phase.