属性値に何らかの手を加えてから格納したいときがある。
たとえば、名前関係のフィールドで「フリガナ」フィールドに全角カタカナだけを入力させたい。
正規表現でそれ以外をキックするのはいいけど、
ひらがなや半角カタカナは自動変換できるから自動変換したいと。
方法はいくつかある。
一般的にはフィールド格納をオーバーライドする方法
もう一つはvalidateをオーバーライドしてそこで何とかする方法
今回はまったのは属性代入をオーバーライドする方法。
ActiveRecordを継承したNameクラスにkanaフィールドがあったとする。
普通のRubyクラスなら
class Name
def kana=(str)
@kana = NKF.nkf('--katakana', str)
end
end
しかし、ARの場合@でクラス変数にアクセスできない。
エイリアスで kana=を別名定義して代入させようとするとこれはだめ。
kana=は定義されていなくて、MethodMissingで代入されるからだ。
self.kana=で代入すると普通に無限ループに陥っちゃう。
どうするかというと、別のアクセス方法を試す。
class Name < ActiveRecord::Base
def kana=(str)
self[:kana] = NKF.nkf('--katakana', str)
end
end
とまあこんな感じ。
と考えるとシンボルでアクセスされると自動変換されないか・・・
素直に考えれば、validateをオーバーライドするのがいいのかもね。
どっちにしても検証はしないといけないしね。
class Name < ActiveRecord::Base
def validate
self.kana = NKF.nkf('--katakana', self.kana)
unless self.kana =~ /カタカナかどうかを判別する/
self.errors.add :kana, "全角カタカナで入力してください"
end
end
end
PR