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

Class Method Details

.allObject



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.message)
end

.imported_from_initializer?Boolean

Returns:

  • (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.

Returns:

  • (Boolean)


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_cacheObject



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