Module: SpreeAddressFormatI18n::AddressDecorator

Defined in:
app/models/spree_address_format_i18n/address_decorator.rb

Constant Summary collapse

FIELDS_TO_NORMALIZE =
[ "phone", "alternative_phone", "zipcode" ]

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.prepended(base) ⇒ Object



5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 5

def self.prepended(base)
  base.before_validation :remove_emoji_and_normalize

  base.const_set(:ADDRESS_FIELDS, %w[firstname lastname firstname_kana lastname_kana company address1 address2 city state zipcode country phone fax company_kana])

  # カナ presence は「新規入力」または「このリクエストでカナを変更したとき」のみ要求する。
  # use_kana_fields を後から有効化したストアには、カナ未登録の既存住所が多数存在する
  # (実運用のストアでは3割を超えることもある)。これらは clone_shipping_address で bill=ship として再検証される
  # 際に空のままなので、無条件 presence だと既存ユーザーがチェックアウトできなくなる。
  # 永続済み・未変更の空カナはスキップし、新規 or ユーザーが明示的にカナを変更/クリアした
  # 場合のみ必須にすることで、データ品質(新規は必須)と既存ユーザーの購入可否を両立する。
  # @see https://github.com/be-agile/giga-repeat/issues/1210
  kana_presence_required = lambda do |address, field|
    next false unless Spree::Store.current.use_kana_fields
    address.new_record? || address.public_send(:"#{field}_changed?")
  end

  # セイ(lastname_kana)を先に定義してエラーメッセージの順序を制御
  base.validates :lastname_kana, presence: true, if: -> { kana_presence_required.call(self, :lastname_kana) }
  base.validates :lastname_kana, format: { with: /\A[\p{Katakana}\p{Blank}ー・]+\z/, allow_blank: true, message: :invalid_katakana }, if: -> { Spree::Store.current.use_kana_fields }

  # メイ(firstname_kana)
  base.validates :firstname_kana, presence: true, if: -> { kana_presence_required.call(self, :firstname_kana) }
  base.validates :firstname_kana, format: { with: /\A[\p{Katakana}\p{Blank}ー・]+\z/, allow_blank: true, message: :invalid_katakana }, if: -> { Spree::Store.current.use_kana_fields }

  base.validates :company_kana, format: { with: /\A[\p{Katakana}\p{Blank}ー・]+\z/ }, if: -> { company_kana.present? }
end

Instance Method Details

#full_nameObject

@gem-override spree_core-5.3.6/app/models/spree/address.rb#full_name 本家 "#{firstname} #{lastname}" ではなく、i18n の名前順・接尾辞(様 等)を反映する。



94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 94

def full_name
  field_suffixes = I18n.t('address_format_i18n.field_suffixes', default: {})

  name = I18n.t("address_format_i18n.address.full_name", default: [ "firstname", "lastname" ])
    .map { |part| send(part) if respond_to?(part) }
    .compact.join(" ").strip

  # fnグループの接尾辞があれば追加
  suffix = field_suffixes['fn'] || field_suffixes[:fn]
  name += " #{suffix}" if suffix && name.present?

  name
end

#onelineObject



51
52
53
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 51

def oneline
  texts.join(" ")
end

#textsObject



55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 55

def texts
  delimiter = I18n.t("address_format_i18n.delimiter", default: " ")
  groups = I18n.t('address_format_i18n.groups').deep_dup
  field_suffixes = I18n.t('address_format_i18n.field_suffixes', default: {})

  unless Spree::Store.current.use_kana_fields
    fn_group = groups.find { |group| group[:name] == 'fn' }
    fn_group[:fields] = fn_group[:fields].reject { |field| field.include?('kana') }
  end

  result = groups.flat_map do |group|
    nodes = group[:children] || [ group ]

    nodes.map do |node|
      # show_country_fieldがfalseの場合、countryフィールドを除外
      visible_fields = node[:fields].dup
      visible_fields.reject! { |field| field.to_s == 'country' } unless Spree::Store.current.show_country_field

      # 名前グループの特別処理(カナがある場合)
      if group[:name] == 'fn' && Spree::Store.current.use_kana_fields
        line = format_name_with_kana(visible_fields, delimiter)
      else
        field_values = visible_fields.filter_map { |field| respond_to?(field) ? send(field) : nil }
        line = field_values.join(delimiter) if field_values.present?
      end

      if line.present?
        # グループに接尾辞が設定されている場合は追加
        suffix = field_suffixes[group[:name].to_sym] || field_suffixes[group[:name]]
        line += " #{suffix}" if suffix
        line
      end
    end
  end
end

#to_sObject

@gem-override spree_core-5.3.6/app/models/spree/address.rb#to_s 本家の固定フォーマットではなく、i18n の groups 定義に沿った日本語住所表記で組む。



37
38
39
40
41
42
43
44
45
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 37

def to_s
  # texts.reject(&:blank?).join("<br/>").html_safe
  safe_texts = texts.reject(&:blank?).map do |text|
    ERB::Util.html_escape(text.to_s)
  end
  # rubocop:disable Rails/OutputSafety
  safe_texts.join("<br/>").html_safe
  # rubocop:enable Rails/OutputSafety
end

#to_textObject



47
48
49
# File 'app/models/spree_address_format_i18n/address_decorator.rb', line 47

def to_text
  texts.reject(&:blank?).join("\n")
end