Module: Spree::Preferences::PreferableClassMethods

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

Constant Summary

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

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)


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

def allowed_admin_form_preference_types
  DEFAULT_ADMIN_FORM_PREFERENCE_TYPES
end

#defined_preferencesObject



12
13
14
# File 'lib/spree/preferences/preferable_class_methods.rb', line 12

def defined_preferences
  []
end

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



16
17
18
19
20
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
# File 'lib/spree/preferences/preferable_class_methods.rb', line 16

def preference(name, type, options = {})
  options.assert_valid_keys(:default)
  default = options[:default]
  default = ->{ options[:default] } unless default.is_a?(Proc)

  # 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
    preferences.fetch(name) do
      default.call
    end
  end

  define_method preference_setter_method(name) do |value|
    value = convert_preference_value(value, type)
    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), &default

  define_method preference_type_getter_method(name) do
    type
  end
end

#preference_default_getter_method(name) ⇒ Object



65
66
67
# File 'lib/spree/preferences/preferable_class_methods.rb', line 65

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

#preference_getter_method(name) ⇒ Object



57
58
59
# File 'lib/spree/preferences/preferable_class_methods.rb', line 57

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

#preference_setter_method(name) ⇒ Object



61
62
63
# File 'lib/spree/preferences/preferable_class_methods.rb', line 61

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

#preference_type_getter_method(name) ⇒ Object



69
70
71
# File 'lib/spree/preferences/preferable_class_methods.rb', line 69

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