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)




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

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)
      unless setting.value.nil?
        return cache[name] = setting.value
      end
    end
  end
  # Check YAML settings
  if yaml_settings.key?(name)
    return cache[name] = yaml_settings[name]
  end
end

.[]=(name, value) ⇒ Object

Set setting value




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

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.



35
36
37
# File 'app/models/setting.rb', line 35

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

.database_and_table_exists?Boolean

Returns:

  • (Boolean)


88
89
90
91
92
93
# File 'app/models/setting.rb', line 88

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 false
end

.load_settings_from_yaml(file) ⇒ Object

Loads settings from YAML files



96
97
98
99
# File 'app/models/setting.rb', line 96

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




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

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.




84
85
86
# File 'app/models/setting.rb', line 84

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