Railsテキストエリア文字数制限

サーバーサイドにデータを飛ばす前に入力に制限をかけましょう

こんにちは。 アジャイル開発で仕様は変わりまくりますが、全く腐らないので先輩に重宝されており、色々と覚えられるので楽しい限りの筆者です。(だって本当に公務員時代の100万倍仕事が楽しいんですもの😄)

今回から仕事中にメモした内容を復習等の意味を込めて、このブログにも記載していこうと思います。

また、可能な限りRails等のフレームワークの裏でどのようなSQLが動いているか、どのような処理を裏でしているのか、なども考えていきたいと思います。

今回は物凄く基礎的な話ですが、非常に重要なテキストボックス・テキストエリア等の文字数制限とvarchar型のデータを取り扱う時の注意点をまとめておきます。

テーブル定義

今回例えば、次のようなmigrationファイルで次のようなテーブル(Memberモデル)を作成しているとします。

class CreateMembers < ActiveRecord::Migration[5.1]
  def change
    create_table:memberes do |t|
    #migrationでは意識しないけどidが生成されているよ
    t.string :simei, :null => false, :limit => 40  , comment: "氏名"
    t.numeric :age, :null => false, :limit => 3  , comment: "年齢"
    t.timestamps
    end
  end
end

Postgreで同じようなテーブルを作るとしたら、こんな感じ。

create table members2(
    id bigint primary key not null 
    , simei varchar(40) not null
    , age numeric(3,0) not null
    , created_at timestamp default CURRENT_TIMESTAMP not null
    , updated_at timestamp not null
);
--ついでにデータも生成するならこう
insert into members2(id,simei,age,updated_at)
values
(1,'飯塚 悟志',46,Now()),
(2,'豊本 明長',44,Now()),
(3, '角田 晃広', 45,Now());

このテーブルについて、viewでフォームを作成してあげて、ユーザーに入力してもらいます。

列定義自体に文字数制限などをかけていますので、そもそも文字数を超えた入力値はサーバー側で弾かれるようになっていますが、塵も積もれば・・・ということで、そもそもDB側にオーバーフローを起こさせないように、フォーム側で文字数制限をかけよう!ってなもんです。

さて、これについてRailsのフォームヘルパーでテキストボックス等を生成するなら、こんな感じ

<%= form_for @member, format: 'json',remote:true, url:members_path  do |f| %>

<!-- 中略 -->
<!-- 年齢(そのまま桁数制限) -->
<%= f.telephone_field :age,maxlength:3 %>
<!-- 氏名(エンコーディングを考慮して文字数制限を) -->
<%= dSyomeiSinseis_fields.text_field :simei,maxlength:40 %>

<% end %>

注意が必要なのは、氏名欄です。 (そもそも年齢はセレクトボックスで良いのではないかとかいうのは置いておいて) 年齢はnumeric型で整数部分が3桁までになるようにすれば良いので、そのままmaxlength:3で事足りますが、 氏名欄は、列の定義が **varchar(40)**となっていることに注意が必要です🌟

varchar型で40と指定しているのは、

char/varchar の n 文字は n バイトではなく、利用している文字エンコーディングの n 文字分のデータが保存できます。

今回のエンコーディングには、Unicodeを利用しています。

ということで、Unicodeでは全角でも半角でも文字数は1と数えられるそうですので、そのまま40文字制限としていますが、エンコーディングを考慮して、決めるようにする必要があるようです。

※ちなみにvarcharは可変長の文字列型でchar型は固定長の文字列型です。char型で文字数を指定し他場合、その文字数に満たないものは空白文字で埋められて保存されます。その処理に無駄なパワーを取られることもあるようですね。

RailsのORMに甘えないようにしなきゃ・・・

と言うわけで、物凄く基礎的なことですが、復習をしながら描いてみました。

RailsではモデルとActiveRecordを通して簡単にレコードの取得、生成を行うことができますが、 裏でどのようにSQLが動いているか意識しないと、現場で積むので、少しづつでも覚えていことが大事ですね⭐️