lib/rails-settings/base.rb in rails-settings-cached-2.8.3 vs lib/rails-settings/base.rb in rails-settings-cached-2.9.0
- old
+ new
@@ -6,11 +6,10 @@
super("Can't use #{key} as setting key.")
end
end
class Base < ActiveRecord::Base
- SEPARATOR_REGEXP = /[\n,;]+/
PROTECTED_KEYS = %w[var value]
self.table_name = table_name_prefix + "settings"
# get the value field, YAML decoded
def value
@@ -53,11 +52,11 @@
yield block
@scope = nil
end
def get_field(key)
- @defined_fields.find { |field| field[:key] == key.to_s } || {}
+ @defined_fields.find { |field| field.key == key.to_s }.to_h || {}
end
def cache_prefix(&block)
@cache_prefix = block
end
@@ -67,19 +66,19 @@
key_parts << @cache_prefix.call if @cache_prefix
key_parts.join("/")
end
def keys
- @defined_fields.map { |field| field[:key] }
+ @defined_fields.map(&:key)
end
def editable_keys
- @defined_fields.reject { |field| field[:readonly] }.map { |field| field[:key] }
+ @defined_fields.reject(&:readonly).map(&:key)
end
def readonly_keys
- @defined_fields.select { |field| field[:readonly] }.map { |field| field[:key] }
+ @defined_fields.select(&:readonly).map(&:key)
end
attr_reader :defined_fields
private
@@ -87,60 +86,27 @@
def _define_field(key, default: nil, type: :string, readonly: false, separator: nil, validates: nil, **opts)
key = key.to_s
raise ProtectedKeyError.new(key) if PROTECTED_KEYS.include?(key)
+ field = ::RailsSettings::Fields::Base.generate(
+ scope: @scope, key: key, default: default,
+ type: type, readonly: readonly, options: opts,
+ separator: separator, parent: self
+ )
@defined_fields ||= []
- @defined_fields << {
- scope: @scope,
- key: key,
- default: default,
- type: type || :string,
- readonly: readonly.nil? ? false : readonly,
- options: opts
- }
+ @defined_fields << field
- if readonly
- define_singleton_method(key) do
- result = default.is_a?(Proc) ? default.call : default
- send(:_convert_string_to_typeof_value, type, result, separator: separator)
- end
- else
- define_singleton_method(key) do
- val = send(:_value_of, key)
- result = nil
- if !val.nil?
- result = val
- else
- result = default
- result = default.call if default.is_a?(Proc)
- end
+ define_singleton_method(key) { field.read }
- result = send(:_convert_string_to_typeof_value, type, result, separator: separator)
+ unless readonly
+ define_singleton_method("#{key}=") { |value| field.save!(value: value) }
- result
- end
-
- define_singleton_method("#{key}=") do |value|
- var_name = key
-
- record = find_by(var: var_name) || new(var: var_name)
- value = send(:_convert_string_to_typeof_value, type, value, separator: separator)
-
- record.value = value
- record.save!
-
- value
- end
-
if validates
validates[:if] = proc { |item| item.var.to_s == key }
send(:validates, key, **validates)
-
- define_method(:read_attribute_for_validation) do |_key|
- self.value
- end
+ define_method(:read_attribute_for_validation) { |_key| self.value }
end
end
if type == :boolean
define_singleton_method("#{key}?") do
@@ -152,52 +118,9 @@
# setting = Setting.new
# setting.admin_emails
define_method(key) do
self.class.public_send(key)
end
- end
-
- def _convert_string_to_typeof_value(type, value, separator: nil)
- return value unless [String, Integer, Float, BigDecimal].include?(value.class)
-
- case type
- when :boolean
- ["true", "1", 1, true].include?(value)
- when :array
- value.split(separator || SEPARATOR_REGEXP).reject { |str| str.empty? }.map(&:strip)
- when :hash
- value = begin
- YAML.safe_load(value).to_h
- rescue
- {}
- end
- value.deep_stringify_keys!
- ActiveSupport::HashWithIndifferentAccess.new(value)
- when :integer
- value.to_i
- when :float
- value.to_f
- when :big_decimal
- value.to_d
- else
- value
- end
- end
-
- def _value_of(var_name)
- unless _table_exists?
- # Fallback to default value if table was not ready (before migrate)
- puts "WARNING: table: \"#{table_name}\" does not exist or not database connection, `#{name}.#{var_name}` fallback to returns the default value."
- return nil
- end
-
- _all_settings[var_name]
- end
-
- def _table_exists?
- table_exists?
- rescue
- false
end
def rails_initialized?
Rails.application&.initialized?
end