【98】【Rails】リファクタリングトレーニング。extend ActiveSupport::Concern
改善したいコード
class StaffMember < ApplicationRecord
include StringNormalizer
before_validation do
self.family_name = normalize_as_name(family_name)
self.given_name = normalize_as_name(given_name)
self.family_name_kana = normalize_as_furigana(family_name_kana)
self.given_name_kana = normalize_as_furigana(given_name_kana)
self.email = normalize_as_email(email)
end
HUMAN_NAME_REGEXP = /\A[\p{han}\p{hiragana}\p{katakana}\u{30fc}A-Za-z]+\z/
KATAKANA_REGEXP = /\A[\p{katakana}\u{30fc}]+\z/
validates :family_name, :given_name, presence: true,
format: { with: HUMAN_NAME_REGEXP, allow_blank: true }
validates :family_name_kana, :given_name_kana, presence: true,
format: { with: KATAKANA_REGEXP, allow_blank: true }
validates :email, presence: true, "valid_email_2/email": true,
uniqueness: { case_sensitive: false }
end
require "nkf"
module StringNormalizer
extend ActiveSupport::Concern
def normalize_as_email(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
def normalize_as_name(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
def normalize_as_furigana(text)
NKF.nkf("-W -w -Z1 --katakana", text).strip if text
end
def normalize_as_postal_code(text)
NKF.nkf("-W -w -Z1", text).strip.gsub(/-/, "") if text
end
def normalize_as_phone_number(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
end
リファクタリング
class StaffMember < ApplicationRecord
include EmailHolder
include PersonalNameHolder
end
module PersonalNameHolder
extend ActiveSupport::Concern
HUMAN_NAME_REGEXP = /\A[\p{han}\p{hiragana}\p{katakana}\u{30fc}A-Za-z]+\z/
KATAKANA_REGEXP = /\A[\p{katakana}\u{30fc}]+\z/
included do
include StringNormalizer
before_validation do
self.family_name = normalize_as_name(family_name)
self.given_name = normalize_as_name(given_name)
self.family_name_kana = normalize_as_furigana(family_name_kana)
self.given_name_kana = normalize_as_furigana(given_name_kana)
end
validates :family_name, :given_name, presence: true,
format: { with: HUMAN_NAME_REGEXP, allow_blank: true }
validates :family_name_kana, :given_name_kana, presence: true,
format: { with: KATAKANA_REGEXP, allow_blank: true }
end
end
module EmailHolder
extend ActiveSupport::Concern
included do
include StringNormalizer
before_validation do
self.email = normalize_as_email(email)
end
validates :email, presence: true, "valid_email_2/email": true,
uniqueness: { case_sensitive: false }
end
end
require "nkf"
module StringNormalizer
extend ActiveSupport::Concern
def normalize_as_email(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
def normalize_as_name(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
def normalize_as_furigana(text)
NKF.nkf("-W -w -Z1 --katakana", text).strip if text
end
def normalize_as_postal_code(text)
NKF.nkf("-W -w -Z1", text).strip.gsub(/-/, "") if text
end
def normalize_as_phone_number(text)
NKF.nkf("-W -w -Z1", text).strip if text
end
end
ポイント
extend ActiveSupport::Concern
ActiveSupport::Concernをextendすると、クラスメソッドincludeが使えるようになる。
include do
end
includeはブロックを受け取り、ブロック内のコードがモジュールを読み込んだクラスの文脈で評価されます。
関連する記事
参考文献
最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)
現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は98件目の投稿。目標達成!!!!
目標再設定
20日までに100件目指す!!(98件目)
20日超えたが、寝るまでは20日営業日!!(まだ寝てない、ちょっと寝##峠を超え目が覚めた!)
気持ちは20日!
よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。
この記事が気に入ったらサポートをしてみませんか?