3
1

More than 3 years have passed since last update.

カタカナ入力にバリデーションをかける(+入力時に平仮名をカタカナに変換させる)

Posted at

カタカナ入力カラムを用意する

例えばHogeモデルのnameカラムとname_kanaカラムを作って入力フォームを作ります。ここでname_kanaカラムにはカタカナ50音と-(長音符)に限定したいところです。2つの工程で確実にカタカナを入力させるように作っていきましょう。

モデルにバリデーションをかける

まずはモデルにカタカナ(+長音符)以外のものが入らないようにバリデーションをかけます。

Hoge.rb

KATAKANA_REGEXP = /\A[\p{katakana}\u{30fc}]+\z/

定数に正規表現を代入します。以下バリデーションで使用します。なんじゃこりゃと思った方!こちらの記事が参考になるかと思います。ありがたいですね。\p{katakana}はカナ1字にマッチします。\u{30fc}は長音符にマッチします。

Hoge.rb

validates :name_kana, format: { :with KATAKANA_REGEXP }

これで全角カナと長音符以外は弾けるようになりました。

before_validationで平仮名をカタカナに変換させる

RubyのライブラリにあるNKFモジュールを使います。わからない方はこちら

foo.rb
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しましょう。

foo.rb

require "nkf"

module Katakana
  def change_kana(text)
    NKF.nkf("-W -w -Z1 --katakana", text).strip
  end
end

モデルにコールバックを書き込んでいきます。

Hoge.rb

include Katakana

before_validation do
  self.name_kana = change_kana(name_kana)
end

name_kanaをchange_kanaが引数に取ってself(Hoge)に返します。selfにバリデーションがかかる前にこれらのコードが実行されます。平仮名で「ほげ」と入れると、データ入力前に「ホゲ」に変換されます。

参考教材

Ruby on Rails 6 実践ガイド

3
1
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1