Module: RubyCms::Settings
- Defined in:
- lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb
Constant Summary collapse
- IMPORT_SENTINEL_KEY =
"__internal_initializer_import_v1"
Class Method Summary collapse
- .all ⇒ Object
- .coerce_by_entry(value, entry) ⇒ Object
- .ensure_defaults! ⇒ Object
- .get(key, default: nil) ⇒ Object
-
.import_initializer_values!(force: false) ⇒ Object
Imports initializer values for any key that exists in SettingsRegistry and is explicitly set on config.ruby_cms.
- .imported_from_initializer? ⇒ Boolean
-
.preference_table_available? ⇒ Boolean
Memoizes the positive result: once the preferences table exists it won't vanish for the life of the process, so we skip the per-lookup probe (this is called many times per admin request via the nav).
-
.preload_keys(keys) ⇒ Object
Bulk-load a specific list of keys into the request cache.
-
.preload_preferences(prefix:) ⇒ Object
Bulk-load preferences into a request-scoped cache so the nav rendering does not run one SELECT per nav_show_* key.
- .reset_preference_cache ⇒ Object
- .set(key, value) ⇒ Object
Class Method Details
.all ⇒ Object
34 35 36 37 38 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 34 def all return {} unless preference_table_available? ::Preference.all_as_hash end |
.coerce_by_entry(value, entry) ⇒ Object
177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 177 def coerce_by_entry(value, entry) return value if entry.nil? case entry.type when :integer value.to_i when :boolean ActiveModel::Type::Boolean.new.cast(value) when :json value.kind_of?(String) ? JSON.parse(value) : value else value.to_s end rescue JSON::ParserError value end |
.ensure_defaults! ⇒ Object
29 30 31 32 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 29 def ensure_defaults! RubyCms::SettingsRegistry.seed_defaults! ::Preference.ensure_defaults! end |
.get(key, default: nil) ⇒ Object
8 9 10 11 12 13 14 15 16 17 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 8 def get(key, default: nil) k = key.to_s pref = fetch_preference(k) return pref.typed_value if pref entry = RubyCms::SettingsRegistry.fetch(k) return entry.default unless entry.nil? default end |
.import_initializer_values!(force: false) ⇒ Object
Imports initializer values for any key that exists in SettingsRegistry and is explicitly set on config.ruby_cms.
42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 42 def import_initializer_values!(force: false) return skipped_result("preferences table unavailable") unless preference_table_available? ensure_defaults! return skipped_result("already imported") if imported_from_initializer? && !force config = ruby_cms_config return skipped_result("ruby_cms config unavailable") if config.nil? imported_keys = [] RubyCms::SettingsRegistry.each do |entry| key = entry.key.to_sym next unless config.respond_to?(key) value = config.public_send(key) next if value.nil? set(key, value) imported_keys << entry.key end mark_imported!(imported_keys) { skipped: false, imported_count: imported_keys.size, imported_keys: imported_keys } rescue StandardError => e skipped_result(e.) end |
.imported_from_initializer? ⇒ Boolean
76 77 78 79 80 81 82 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 76 def imported_from_initializer? return false unless preference_table_available? ::Preference.exists?(key: IMPORT_SENTINEL_KEY) rescue StandardError false end |
.preference_table_available? ⇒ Boolean
Memoizes the positive result: once the preferences table exists it won't vanish for the life of the process, so we skip the per-lookup probe (this is called many times per admin request via the nav). Stays false-and-rechecks during boot/migrate until the table appears.
167 168 169 170 171 172 173 174 175 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 167 def preference_table_available? return true if @preference_table_available return false unless defined?(ActiveRecord::Base) && defined?(::Preference) @preference_table_available = true if ActiveRecord::Base.connection.data_source_exists?("preferences") @preference_table_available || false rescue ActiveRecord::ConnectionNotEstablished, ActiveRecord::NoDatabaseError, ActiveRecord::StatementInvalid false end |
.preload_keys(keys) ⇒ Object
Bulk-load a specific list of keys into the request cache. Cheaper than calling .get per key in a loop (used by Settings index for the active tab).
145 146 147 148 149 150 151 152 153 154 155 156 157 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 145 def preload_keys(keys) return unless preference_table_available? return if keys.blank? Thread.current[:ruby_cms_pref_cache] ||= {} cache = Thread.current[:ruby_cms_pref_cache] str_keys = Array(keys).map(&:to_s) ::Preference.where(key: str_keys).each { |pref| cache[pref.key] = pref } # Mark missing keys as nil in cache so fetch_preference doesn't re-query. str_keys.each { |k| cache[k] = nil unless cache.key?(k) } rescue StandardError nil end |
.preload_preferences(prefix:) ⇒ Object
Bulk-load preferences into a request-scoped cache so the nav rendering does not run one SELECT per nav_show_* key. Called from Admin::ApplicationController#preload_nav_prefs.
131 132 133 134 135 136 137 138 139 140 141 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 131 def preload_preferences(prefix:) return unless preference_table_available? Thread.current[:ruby_cms_pref_cache] ||= {} cache = Thread.current[:ruby_cms_pref_cache] ::Preference.where("key LIKE ?", "#{prefix}%").each do |pref| cache[pref.key] = pref end rescue StandardError nil end |
.reset_preference_cache ⇒ Object
159 160 161 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 159 def reset_preference_cache Thread.current[:ruby_cms_pref_cache] = nil end |
.set(key, value) ⇒ Object
19 20 21 22 23 24 25 26 27 |
# File 'lib/generators/ruby_cms/templates/lib/ruby_cms/settings.rb', line 19 def set(key, value) raise "Settings table not available yet" unless preference_table_available? k = key.to_s entry = RubyCms::SettingsRegistry.fetch(k) coerced = coerce_by_entry(value, entry) ::Preference.set(k, coerced) end |