Application-wide settings for Rails apps can be very useful in many different scenarios. For example, let’s say you want a place to store API keys for various 3rd party services used in your app. Instead of hard-coding them in the model, I think it is much cleaner to have a settings file where you store all of this information. And to make things even easier, you should be able to define different values for dev, test, and production. There are many ways to achieve this. You can set some Ruby constants and namespace them or create a model that stores these settings in the database. I prefer a simpler solution that does not require much setup. Initially I was using settingslogic, which I found very useful, but I decided to take this a bit further and build a plugin that I could maintain and one that fits my needs. Yettings is what I came up with. While very much inspired by settingslogic, the key difference is not having to define a class along with your YAML file. The class you will use to access your key/value pairs is created dynamically at boot time, based on the name of the yml file in your config directory.
Here is how you use Yettings in your own app:
Install the gem
Add Yettings to your Gemfile and “bundle install”
> bundle install
Create a YAML file:
This file will define all of your key/value pairs. Include all relevant key/value pairs in the default section and anything related to a specific environment in the dev, test, production sections. Note that custom environments will also work without any additional setup. staging for example. Any valid YAML will work, and you can also use erb within the YAML.
Access the values anywhere in your Rails app
Creating custom named Yettings
If you need separate Yettings for different pieces of your app (or if you are using this in a rails plugin), then you can add the yml file to a subdirectory named “yettings”. For instance:
Yettings will append the name you specified in camel case to the class that you access the values with:
I am using this with several of my rails apps and so far it seems to be working well. If you have any suggestions or issues, please leave me a comment or open up a github issue in the repo.