Class: Spree::Address

Inherits:
Base
  • Object
show all
Extended by:
ActiveModel::ForbiddenAttributesProtection
Defined in:
app/models/spree/address.rb

Overview

‘Spree::Address` provides the foundational ActiveRecord model for recording and validating address information for `Spree::Order`, `Spree::Shipment`, `Spree::UserAddress`, and `Spree::Carton`.

Constant Summary collapse

DB_ONLY_ATTRS =
%w(id updated_at created_at)
TAXATION_ATTRS =
%w(state_id country_id zipcode)

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from Base

display_includes, #initialize_preference_defaults, page, preference

Methods included from Preferences::Preferable

#admin_form_preference_names, #default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference

Class Method Details

.build_defaultObject



33
34
35
# File 'app/models/spree/address.rb', line 33

def self.build_default
  new(country: Spree::Country.default)
end

.factory(attributes) ⇒ Address



38
39
40
41
# File 'app/models/spree/address.rb', line 38

def self.factory(attributes)
  full_attributes = value_attributes(column_defaults, new(attributes).attributes)
  find_or_initialize_by(full_attributes)
end

.immutable_merge(existing_address, new_attributes) ⇒ Address

@note, this may return existing_address if there are no changes to value equality



45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/models/spree/address.rb', line 45

def self.immutable_merge(existing_address, new_attributes)
  # Ensure new_attributes is a sanitized hash
  new_attributes = sanitize_for_mass_assignment(new_attributes)

  return factory(new_attributes) if existing_address.nil?

  merged_attributes = value_attributes(existing_address.attributes, new_attributes)
  new_address = factory(merged_attributes)
  if existing_address == new_address
    existing_address
  else
    new_address
  end
end

.value_attributes(base_attributes, merge_attributes = nil) ⇒ Hash



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'app/models/spree/address.rb', line 61

def self.value_attributes(base_attributes, merge_attributes = nil)
  # dup because we may modify firstname/lastname.
  base = base_attributes.dup

  base.stringify_keys!

  if merge_attributes
    base.merge!(merge_attributes.stringify_keys)
  end

  # TODO: Deprecate these aliased attributes
  base['firstname'] = base.delete('first_name') if base.key?('first_name')
  base['lastname'] = base.delete('last_name') if base.key?('last_name')

  base.except!(*DB_ONLY_ATTRS)
end

Instance Method Details

#==(other_address) ⇒ Boolean

Note:

This compares the addresses based on only the fields that make up the logical “address” and excludes the database specific fields (id, created_at, updated_at).

Returns true if the two addresses have the same address fields.



104
105
106
107
# File 'app/models/spree/address.rb', line 104

def ==(other_address)
  return false unless other_address && other_address.respond_to?(:value_attributes)
  value_attributes == other_address.value_attributes
end

#active_merchant_hashHash



135
136
137
138
139
140
141
142
143
144
145
146
# File 'app/models/spree/address.rb', line 135

def active_merchant_hash
  {
    name: full_name,
    address1: address1,
    address2: address2,
    city: city,
    state: state_text,
    zip: zipcode,
    country: country.try(:iso),
    phone: phone
  }
end

#blank?Boolean

This exists because the default Object#blank?, checks empty? if it is defined, and we have defined empty. This should be removed once empty? is removed



130
131
132
# File 'app/models/spree/address.rb', line 130

def blank?
  false
end

#country_isoObject



175
176
177
# File 'app/models/spree/address.rb', line 175

def country_iso
  country && country.iso
end

#country_iso=(iso) ⇒ Country

Returns setter that sets self.country to the Country with a matching 2 letter iso.

Raises:

  • (ActiveRecord::RecordNotFound)

    if country with the iso doesn’t exist



171
172
173
# File 'app/models/spree/address.rb', line 171

def country_iso=(iso)
  self.country = Spree::Country.find_by!(iso: iso)
end

#empty?Boolean

Deprecated.

Do not use this



122
123
124
125
# File 'app/models/spree/address.rb', line 122

def empty?
  Spree::Deprecation.warn("Address#empty? is deprecated.", caller)
  attributes.except('id', 'created_at', 'updated_at', 'country_id').all? { |_, v| v.nil? }
end

#full_nameString



88
89
90
# File 'app/models/spree/address.rb', line 88

def full_name
  "#{firstname} #{lastname}".strip
end

#readonly?Boolean

This is set in order to preserve immutability of Addresses. Use #dup to create new records as required, but it probably won’t be required as often as you think. Since addresses do not change, you won’t accidentally alter historical data.



164
165
166
# File 'app/models/spree/address.rb', line 164

def readonly?
  persisted?
end

#require_phone?true



151
152
153
# File 'app/models/spree/address.rb', line 151

def require_phone?
  true
end

#require_zipcode?true



157
158
159
# File 'app/models/spree/address.rb', line 157

def require_zipcode?
  true
end

#same_as(other_address) ⇒ Object

Deprecated.

Do not use this. Use Address.== instead.



116
117
118
119
# File 'app/models/spree/address.rb', line 116

def same_as(other_address)
  Spree::Deprecation.warn("Address#same_as is deprecated. It's equivalent to Address.==", caller)
  self == other_address
end

#same_as?(other_address) ⇒ Boolean

Deprecated.

Do not use this. Use Address.== instead.



110
111
112
113
# File 'app/models/spree/address.rb', line 110

def same_as?(other_address)
  Spree::Deprecation.warn("Address#same_as? is deprecated. It's equivalent to Address.==", caller)
  self == other_address
end

#state_textString



93
94
95
# File 'app/models/spree/address.rb', line 93

def state_text
  state.try(:abbr) || state.try(:name) || state_name
end

#taxation_attributesObject



83
84
85
# File 'app/models/spree/address.rb', line 83

def taxation_attributes
  self.class.value_attributes(attributes.slice(*TAXATION_ATTRS))
end

#to_sObject



97
98
99
# File 'app/models/spree/address.rb', line 97

def to_s
  "#{full_name}: #{address1}"
end

#value_attributesHash



79
80
81
# File 'app/models/spree/address.rb', line 79

def value_attributes
  self.class.value_attributes(attributes)
end