When you build advanced UI’s for your Saas there will be a point you need to store certain preferences or appearance settings for a user or workspace, like:
- synced light- and dark-theme;
- expand/collapsed state for navigation items;
- time zone.
And so on. I’ve come across this use cases in every app I built. For a long time I used a set up like described in this article. But ever since I published it, and even including a template to get the required code in your app, I got questions if it wasn’t better as a gem.
So after about 10 months, here is: Rails Vault.
Rails Vault is a simple gem to add settings and preferences to any ActiveRecord model. The goal is to keep it simple and light-weight. Let’s check out how it works.
Installation is just three lines:
bundle add rails_vault
rails generate rails_vault:install
rails db:migrate
Then you can create a vault for any ActiveRecord model. The convention is that the vaults are stored in the model’s namespace. So when your run:
rails generate rails_vault:add User::Preferences \
time_zone:string \
datetime_format:string \
hotkeys_disabled:boolean
…it will create the following class:
# app/models/user/preferences.rb
class User::Preferences < RailsVault::Base
vault_attribute :time_zone, :string
vault_attribute :datetime_format, :string
vault_attribute :hotkeys_disabled, :boolean
end
Preferences are created with User.first.create_preferences
.
Default values can be set as follows:
# app/models/user/preferences.rb
class User::Preferences < RailsVault::Base
vault_attribute :time_zone, :string, default: "UTC"
vault_attribute :datetime_format, :string, default: "dd-mm-yyyy"
vault_attribute :hotkeys_disabled, :boolean, default: false
end
Reading and updating a value is simple too:
user.preferences.time_zone # => "UTC"
user.preferences.hotkeys_disabled? # => false
user.preferences.update time_zone: "Amsterdam", hotkeys_disabled: true
user.preferences.time_zone # => "Amsterdam"
user.preferences.hotkeys_disabled? # => true
Have ideas or suggestions? Feel free to create a PR. There are also some good first issues that you could pick up.