Module: Spree::Preferences::PreferableClassMethods

Defined in:
lib/spree/preferences/preferable_class_methods.rb

Constant Summary collapse

DEFAULT_ADMIN_FORM_PREFERENCE_TYPES =
%i(
  boolean
  decimal
  integer
  password
  string
  text
  encrypted_string
)

Instance Method Summary collapse

Instance Method Details

#allowed_admin_form_preference_typesArray

List of preference types allowed as form fields in the Solidus admin

Overwrite this method in your class that includes Spree::Preferable if you want to provide more fields. If you do so, you also need to provide a preference field partial that lives in:

app/views/spree/admin/shared/preference_fields/

Returns:

  • (Array)


111
112
113
# File 'lib/spree/preferences/preferable_class_methods.rb', line 111

def allowed_admin_form_preference_types
  DEFAULT_ADMIN_FORM_PREFERENCE_TYPES
end

#defined_preferencesObject



17
18
19
# File 'lib/spree/preferences/preferable_class_methods.rb', line 17

def defined_preferences
  []
end

#preference(name, type, options = {}) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
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
# File 'lib/spree/preferences/preferable_class_methods.rb', line 21

def preference(name, type, options = {})
  options.assert_valid_keys(:default, :encryption_key)

  if type == :encrypted_string
    preference_encryptor = preference_encryptor(options)
    options[:default] = preference_encryptor.encrypt(options[:default])
  end

  default = begin
              given = options[:default]
              if given.is_a?(Proc)
                given
              else
                proc { given }
              end
            end

  # The defined preferences on a class are all those defined directly on
  # that class as well as those defined on ancestors.
  # We store these as a class instance variable on each class which has a
  # preference. super() collects preferences defined on ancestors.
  singleton_preferences = (@defined_singleton_preferences ||= [])
  singleton_preferences << name.to_sym

  define_singleton_method :defined_preferences do
    super() + singleton_preferences
  end

  # cache_key will be nil for new objects, then if we check if there
  # is a pending preference before going to default
  define_method preference_getter_method(name) do
    value = preferences.fetch(name) do
      instance_exec(*context_for_default, &default)
    end
    value = preference_encryptor.decrypt(value) if preference_encryptor.present?
    value
  end

  define_method preference_setter_method(name) do |value|
    value = convert_preference_value(value, type, preference_encryptor)
    preferences[name] = value

    # If this is an activerecord object, we need to inform
    # ActiveRecord::Dirty that this value has changed, since this is an
    # in-place update to the preferences hash.
    preferences_will_change! if respond_to?(:preferences_will_change!)
  end

  define_method preference_default_getter_method(name) do
    instance_exec(*context_for_default, &default)
  end

  define_method preference_type_getter_method(name) do
    type
  end
end

#preference_default_getter_method(name) ⇒ Object



86
87
88
# File 'lib/spree/preferences/preferable_class_methods.rb', line 86

def preference_default_getter_method(name)
  "preferred_#{name}_default".to_sym
end

#preference_encryptor(options) ⇒ Object



94
95
96
97
98
99
100
# File 'lib/spree/preferences/preferable_class_methods.rb', line 94

def preference_encryptor(options)
  key = options[:encryption_key] ||
        ENV['SOLIDUS_PREFERENCES_MASTER_KEY'] ||
        Rails.application.credentials.secret_key_base

  Spree::Encryptor.new(key)
end

#preference_getter_method(name) ⇒ Object



78
79
80
# File 'lib/spree/preferences/preferable_class_methods.rb', line 78

def preference_getter_method(name)
  "preferred_#{name}".to_sym
end

#preference_setter_method(name) ⇒ Object



82
83
84
# File 'lib/spree/preferences/preferable_class_methods.rb', line 82

def preference_setter_method(name)
   "preferred_#{name}=".to_sym
end

#preference_type_getter_method(name) ⇒ Object



90
91
92
# File 'lib/spree/preferences/preferable_class_methods.rb', line 90

def preference_type_getter_method(name)
  "preferred_#{name}_type".to_sym
end