2008年1月27日日曜日

日程調整アプリ - イベント 入力チェック

さて、次に改良するのは、入力項目のチェックだ。昔は RoR などなかったので、今回のようなアプリを作る場合は、たいてい入力項目のチェックを端折るか、簡単なものだけやることになり、十分なチェックはできなかった(していなかった)。(私だけ?)
だが、 RoR はこの辺も簡単に記述できるので早速実践してみた。

まずは空白チェック。
これはかなり楽チンに実現できる。 apps/models/event.rb に
validates_presence_of :name, :desc, :owner_name, :owner_email
と書くだけだ。
これで空白チェックが行われ、空白が発見されると、ページのトップにエラーメッセージが表示されるとともに、該当箇所が赤くなって訂正を促す。これはかなりいい。
エラーメッセージはデフォルトでは英語になっているので、適宜日本語に変更してもいいが、とりあえずはそのままにする。

次はパスワードの設定などでよく使われる、同じ項目を二度入力させてチェックする入力確認だ。
今回は、イベント作成時等に主催者にメールを飛ばすことを考えているので、メアドが正しく入力されているかを確認する。
まず app/models/event.rb に以下の行を追加する
validates_confirmation_of :owner_email
そして、app/view/events/new.html.erb の owner_email の入力フィールドの次に
<%= f.text_field :owner_email_confirmation %>
と、元の名前に _confirmation をつけた入力フィールドを追加する。
これだけで入力の確認が簡単に行える。

そして最後に、uuid の自動入力 の際には先送りした uuid の重複チェックを行いたいと思う。
この uuid の性格は、イベント登録時に自動的に入力され、以後は変更されない、というものだ。
なので、新規作成時に必ず呼ばれる before_create にて、自動入力と重複チェックを行うこととした。
まず、app/view/events/new.html.erb の頭に記載した uuid の自動入力の行を削除する。
そして、app/models/event.rb に以下のように before_create を定義する。
   def before_create
self.uuid = rand(256**16).to_s(16)
while Event.find(:first, :conditions => ["uuid = ?", self.uuid]) != nil
self.uuid = rand(256**16).to_s(16)
end
end
これで間違いではないのだが、同じ記述を二度しているところがどうにもエレガントではない。C の do-while っぽい書き方をすればいいのだが、よく分からなかったのだ。
この辺に Ruby に慣れていないことの弊害が出てしまった。

調べてみたら do-while っぽく書けるらしい、ということで変更
   def before_create
begin
self.uuid = rand(256**16).to_s(16)
end while Event.find(:first, :conditions => ["uuid = ?", self.uuid]) != nil
end

0 件のコメント: