Introducing Rails Vault: simple to add settings to any ActiveRecord model

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.

Get UI & Product Engineering Insights for Rails Apps (and product updates!)

Published at . Have suggestions or improvements on this content? Do reach out.

UI components Library for Ruby on Rails apps

$ 99 one-time
payment

Explore
  • One-time Payment

  • Access to the Entire Library

  • Built using ViewComponent

  • Designed with Tailwind CSS

  • Enhanced with Hotwire

Fractional Rails UI Product Engineer

$ 2k month

Hire
  • UI Modernization

  • Fractional UI and feature improvement

  • JavaScript untaming

  • No full-time commitment

Launch a Rails SaaS app in a month

$ 15k one-time

Book a call
  • Modern Rails app

  • Ready for paying customers in one month

  • 2 - 3 core features

  • You own every line of code