Class: Setting

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/setting.rb

Overview

Fat Free CRM settings are stored in three places, and are loaded in the following order:

1) config/settings.default.yml 2) config/settings.yml (if exists) 3) ‘settings’ table in database (if exists)

Any configured settings in ‘config/settings.yml` will override those in `config/settings.default.yml`, and settings in the database table have the highest priority.

Constant Summary collapse

@@cache =
@@yaml_settings = {}.with_indifferent_access

Class Method Summary collapse

Class Method Details

.[](name) ⇒ Object

Get setting value (from database or loaded YAML files)




55
56
57
58
59
60
61
62
63
64
65
66
# File 'app/models/setting.rb', line 55

def [](name)
  # Return value if cached
  return cache[name] if cache.key?(name)
  # Check database
  if database_and_table_exists?
    if setting = find_by_name(name.to_s)
      return cache[name] = setting.value unless setting.value.nil?
    end
  end
  # Check YAML settings
  return cache[name] = yaml_settings[name] if yaml_settings.key?(name)
end

.[]=(name, value) ⇒ Object

Set setting value




70
71
72
73
74
75
76
# File 'app/models/setting.rb', line 70

def []=(name, value)
  return nil unless database_and_table_exists?
  setting = find_by_name(name.to_s) || new(name: name)
  setting.value = value
  setting.save
  cache[name] = value
end

.clear_cache!Object

Cache should be cleared before each request.



37
38
39
# File 'app/models/setting.rb', line 37

def clear_cache!
  @@cache = {}.with_indifferent_access
end

.database_and_table_exists?Boolean

Returns:

  • (Boolean)


100
101
102
103
104
105
106
107
108
# File 'app/models/setting.rb', line 100

def database_and_table_exists?
  # Returns false if table or database is unavailable.
  # Catches all database-related errors, so that Setting will return nil
  # instead of crashing the entire application.

  table_exists?
rescue StandardError
  false
end

.dig(key, *rest) ⇒ Object

Retrieves the value object corresponding to the each key objects repeatedly. Equivalent to the #dig method on a Hash.




89
90
91
92
93
94
95
96
97
98
# File 'app/models/setting.rb', line 89

def dig(key, *rest)
  value = self[key]
  if value.nil? || rest.empty?
    value
  elsif value.respond_to?(:dig)
    value.dig(*rest)
  else
    raise TypeError, "#{value.class} does not have #dig method"
  end
end

.load_settings_from_yaml(file) ⇒ Object

Loads settings from YAML files



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

def load_settings_from_yaml(file)
  settings = YAML.load(ERB.new(File.read(file)).result)
  @@yaml_settings.deep_merge!(settings)
end

.method_missing(method, *args) ⇒ Object




42
43
44
45
46
47
48
49
50
51
# File 'app/models/setting.rb', line 42

def method_missing(method, *args)
  super
rescue NoMethodError
  method_name = method.to_s
  if method_name.last == "="
    self[method_name.sub("=", "")] = args.first
  else
    self[method_name]
  end
end

.unroll(setting) ⇒ Object

Unrolls [ :one, :two ] settings array into [[ “One”, :one ], [ “Two”, :two ]] picking symbol translations from locale. If setting is not a symbol but string it gets copied without translation.




82
83
84
# File 'app/models/setting.rb', line 82

def unroll(setting)
  send(setting).map { |key| [key.is_a?(Symbol) ? I18n.t(key) : key, key.to_sym] }
end