From f4ff4651a0f94c27ac46bf2b9222cc11e6750c53 Mon Sep 17 00:00:00 2001 From: eelco Date: Thu, 5 Jun 2025 11:16:18 +0700 Subject: [PATCH 1/2] Auto-create vaults --- README.md | 11 +++++++++++ lib/rails_vault.rb | 1 + lib/rails_vault/vaults.rb | 24 ++++++++++++++++++++---- rails_vault.gemspec | 1 + 4 files changed, 33 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 009d4e5..3a234c5 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,17 @@ user.preferences.vault_attributes # => ["time_zone", "datetime_format", "hotkeys ``` +### Auto-create vaults + +Vaults can be created automatically after the parent is created. + +```ruby +class User < ApplicationRecord + vault :preferences, auto_create: true + # for multiple vaults + vaults :preferences, :settings, auto_create_all: true +end +``` ## Contributing diff --git a/lib/rails_vault.rb b/lib/rails_vault.rb index 1f2003c..03a5b8b 100644 --- a/lib/rails_vault.rb +++ b/lib/rails_vault.rb @@ -1,6 +1,7 @@ # frozen_string_literal: true require "store_attribute" + require "rails_vault/version" require "generators/vault_generator" require "rails_vault/engine" diff --git a/lib/rails_vault/vaults.rb b/lib/rails_vault/vaults.rb index 3285775..1cbf36c 100644 --- a/lib/rails_vault/vaults.rb +++ b/lib/rails_vault/vaults.rb @@ -3,20 +3,36 @@ module Vaults extend ActiveSupport::Concern class_methods do - def vault(association_name, class_name: nil) + def vault(association_name, class_name: nil, auto_create: false) + vault_class = class_name || "#{self}::#{association_name.to_s.camelize}" + has_one( association_name, as: :resource, - class_name: class_name.presence || "#{self}::#{association_name.to_s.camelize}", + class_name: vault_class, dependent: :destroy ) + + if auto_create + after_create -> {create_vault(association_name, vault_class)} + end end - def vaults(*association_names) + def vaults(*association_names, auto_create_all: false) association_names.each do |association_name| - has_one(association_name, as: :resource, dependent: :destroy) + vault(association_name, auto_create: auto_create_all) end end end + + included do + private + + def create_vault(association_name, vault_class) + return if public_send(association_name).present? + + vault_class.constantize.create!(resource: self) + end + end end end diff --git a/rails_vault.gemspec b/rails_vault.gemspec index 9e00ed2..441ca72 100644 --- a/rails_vault.gemspec +++ b/rails_vault.gemspec @@ -18,6 +18,7 @@ Gem::Specification.new do |spec| spec.files = Dir["{bin,db,lib}/**/*", "Rakefile", "README.md", "rails_vault.gemspec", "Gemfile", "Gemfile.lock"] spec.required_ruby_version = ">= 3.1.0" + spec.add_dependency "rails", ">= 7.2.2" spec.add_dependency "store_attribute", ">= 1.3" end From f9065cf5d51a5455584709899360e4b389f07c76 Mon Sep 17 00:00:00 2001 From: eelco Date: Thu, 5 Jun 2025 11:25:35 +0700 Subject: [PATCH 2/2] Standard fixes --- lib/rails_vault/vaults.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/rails_vault/vaults.rb b/lib/rails_vault/vaults.rb index 1cbf36c..a8d8050 100644 --- a/lib/rails_vault/vaults.rb +++ b/lib/rails_vault/vaults.rb @@ -14,7 +14,7 @@ def vault(association_name, class_name: nil, auto_create: false) ) if auto_create - after_create -> {create_vault(association_name, vault_class)} + after_create -> { create_vault(association_name, vault_class) } end end @@ -29,7 +29,7 @@ def vaults(*association_names, auto_create_all: false) private def create_vault(association_name, vault_class) - return if public_send(association_name).present? + return if public_send(association_name).present? vault_class.constantize.create!(resource: self) end