Class: Setting

Inherits:
Forest::ApplicationRecord show all
Includes:
Sluggable
Defined in:
app/models/setting.rb

Constant Summary collapse

CACHE_KEY =
'forest_settings'
APPLICATION_CACHE_KEY =
'forest_application_cache_key'
DEFAULT_SETTINGS =
%i(site_title description featured_image)
VALID_VALUE_TYPES =
%w(text boolean image integer string)

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Forest::ApplicationRecord

cache_key, cache_key_name, csv_columns, #expire_cache_key, expire_cache_key, statusable?, #statusable?, to_csv_template, #to_friendly_param, #to_label, #to_select2_response, #to_select2_selection, versionable, #versionable

Class Method Details

.application_cache_keyObject



28
29
30
31
32
# File 'app/models/setting.rb', line 28

def self.application_cache_key
  Rails.cache.fetch APPLICATION_CACHE_KEY do
    SecureRandom.uuid
  end
end

.expire_application_cache_key!Object



24
25
26
# File 'app/models/setting.rb', line 24

def self.expire_application_cache_key!
  Rails.cache.delete APPLICATION_CACHE_KEY
end

.expire_cache!Object



20
21
22
# File 'app/models/setting.rb', line 20

def self.expire_cache!
  Rails.cache.delete CACHE_KEY
end

.for(key) ⇒ Object



12
13
14
# File 'app/models/setting.rb', line 12

def self.for(key)
  self.get(key).try(:value)
end

.get(key) ⇒ Object



16
17
18
# File 'app/models/setting.rb', line 16

def self.get(key)
  self.settings.select { |setting| setting.slug == key.to_s }.first
end

.initialize_from_i18nObject

Define setting values, value types, and descriptions in your i18n file using the following pattern: en:

forest:
  settings:
    banner_text:
      forest_setting_value: true
      forest_setting_value_type: boolean
      forest_setting_description: 'Enable a site-wide banner'


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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'app/models/setting.rb', line 42

def self.initialize_from_i18n
  I18n.backend.send(:init_translations) unless I18n.backend.initialized?
  settings_from_i18n = I18n.backend.send(:translations).dig(:en, :forest, :settings).presence || {}

  # Destroy any settings that are no longer in the i18n initialization or default settings array, and have matching updated and created at timestamps.
  # This means any settings that are added directly from the database will be deleted.
  Setting.all.reject { |setting|
    Array(Setting::DEFAULT_SETTINGS).concat(settings_from_i18n.keys).include?(setting.slug.to_sym)
  }.each { |setting|
    if setting.has_not_been_updated?
      logger.info { "[Forest][Setting] Destroying obsolete setting for #{setting.slug}" }
      setting.destroy
    end
  }

  settings_from_i18n.each do |setting|
    k = setting[0].to_s
    v = setting[1]

    if v.is_a?(Hash) && v.keys.include?(:forest_setting_value)
      v = v[:forest_setting_value]
      value_type_from_i18n = setting[1][:forest_setting_value_type] unless setting[1].try(:[], :forest_setting_value_type).nil?
      description_from_i18n = setting[1][:forest_setting_description] unless setting[1].try(:[], :forest_setting_description).nil?

      if VALID_VALUE_TYPES.none?(value_type_from_i18n)
        logger.warn { "[Forest][Setting] Warning: invalid value type '#{value_type_from_i18n}' for #{setting}. Setting value type to text." }
        value_type_from_i18n = 'text'
      end
    end

    if value_type_from_i18n == 'boolean'
      if [true, 'true'].any?(v)
        v = 1
      else
        v = 0
      end
    end

    if [k, v].all?(&:present?)
      s = Setting.get(k)

      if s.blank?
        s = Setting.new(title: k.titleize, slug: k)
      end

      s.value = v
      s.value_type = value_type_from_i18n unless value_type_from_i18n.nil?
      s.description = description_from_i18n unless description_from_i18n.nil?

      if s.new_record?
        logger.info { "[Forest][Setting] Creating new setting for #{k}" }
        s.save
      elsif s.has_not_been_updated?
        if s.changed?
          logger.info { "[Forest][Setting] Updating value for setting key #{k}" }
          s.update_columns(title: k.titleize, slug: k, value: v)
          s.update_column(:value_type, value_type_from_i18n) unless value_type_from_i18n.nil?
          s.update_column(:description, description_from_i18n) unless description_from_i18n.nil?
        end
      end
    else
      logger.warn { "[Forest][Setting] Warning: unable to create setting for #{setting}. Key or value is blank." }
    end
  end

  expire_cache!
end

.resource_descriptionObject



110
111
112
# File 'app/models/setting.rb', line 110

def self.resource_description
  "Settings are where you define static values that are used throughout the site. For example the title of your website, the description, and other values."
end

Instance Method Details

#has_not_been_updated?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'app/models/setting.rb', line 118

def has_not_been_updated?
  updated_at == created_at
end

#slug_as_key?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'app/models/setting.rb', line 114

def slug_as_key?
  true
end