だが、 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これで間違いではないのだが、同じ記述を二度しているところがどうにもエレガントではない。C の do-while っぽい書き方をすればいいのだが、よく分からなかったのだ。
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
この辺に 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 件のコメント:
コメントを投稿