忍者ブログ
ブログツール、2007/11/06作成
[61] [59] [58] [57] [56] [55] [54] [53] [52] [51] [50
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

属性値に何らかの手を加えてから格納したいときがある。

たとえば、名前関係のフィールドで「フリガナ」フィールドに全角カタカナだけを入力させたい。
正規表現でそれ以外をキックするのはいいけど、
ひらがなや半角カタカナは自動変換できるから自動変換したいと。

方法はいくつかある。
一般的にはフィールド格納をオーバーライドする方法
もう一つは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
この記事にコメントする
name
title
color
mail
URL
comment
pass   Vodafone絵文字 i-mode絵文字 Ezweb絵文字
secret (チェックを入れると管理人だけに表示できます)
この記事へのトラックバック
この記事にトラックバックする:
ついめ~じ
ブログ内検索
フリーエリア
サニーカメラ
Powered by Ninja Blog    template by Temp* factory    icon by MiniaureType

忍者ブログ [PR]