見出し画像

【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はブロックを受け取り、ブロック内のコードがモジュールを読み込んだクラスの文脈で評価されます。

関連する記事

参考文献

Ruby on Rails 6 実践ガイド

最後に
私がブログを書く目的は、素晴らしい本や、素晴らしい方々の技術記事を知って頂きたいからです。ぜひ、上記の参考文献を見て下さい。(noteなので広告とかは一切ありません。)

現在、株式会社grabssに行くために最後の悪あがきをしています!!
現在の進行状況
この記事は98件目の投稿。目標達成!!!!
目標再設定
20日までに100件目指す!!(98件目)
20日超えたが、寝るまでは20日営業日!!(まだ寝てない、ちょっと寝##峠を超え目が覚めた!)
気持ちは20日!

よろしければ、スキボタン及びサポートお願いします。勉強の励みになります。



この記事が気に入ったらサポートをしてみませんか?