カタカナ入力カラムを用意する
例えばHogeモデルのnameカラムとname_kanaカラムを作って入力フォームを作ります。ここでname_kanaカラムにはカタカナ50音と-(長音符)に限定したいところです。2つの工程で確実にカタカナを入力させるように作っていきましょう。
モデルにバリデーションをかける
まずはモデルにカタカナ(+長音符)以外のものが入らないようにバリデーションをかけます。
KATAKANA_REGEXP = /\A[\p{katakana}\u{30fc}]+\z/
定数に正規表現を代入します。以下バリデーションで使用します。なんじゃこりゃと思った方!こちらの記事が参考になるかと思います。ありがたいですね。\p{katakana}はカナ1字にマッチします。\u{30fc}は長音符にマッチします。
validates :name_kana, format: { :with KATAKANA_REGEXP }
これで全角カナと長音符以外は弾けるようになりました。
before_validationで平仮名をカタカナに変換させる
RubyのライブラリにあるNKFモジュールを使います。わからない方はこちら
require "nkf"
module Katakana
def change_kana(text)
NKF.nkf("--katakana", text)
end
end
-Wでutf-8を指定、-wでutf-8を出力、-Z1で全角の英数字、記号、全角スペースを半角に変換します。さらにstripメソッドで文字列の先頭末尾にある空白を除去します。foo.rbをconcernsディレクトリに置く場合はActiveSupport::Concernをextendしましょう。
require "nkf"
module Katakana
def change_kana(text)
NKF.nkf("-W -w -Z1 --katakana", text).strip
end
end
モデルにコールバックを書き込んでいきます。
include Katakana
before_validation do
self.name_kana = change_kana(name_kana)
end
name_kanaをchange_kanaが引数に取ってself(Hoge)に返します。selfにバリデーションがかかる前にこれらのコードが実行されます。平仮名で「ほげ」と入れると、データ入力前に「ホゲ」に変換されます。