プラグインやCPANモジュールの使用を明示的に避けたい理由がわかりません-あなたが思いついたソリューションは、新しいコードなので勝ったことを除いて、プラグインやCPANモジュールと同じことをする可能性があります成熟してテストされているわけではありません。
最近、Dancerを使用して簡単なアプリを開発し始めました。CPANモジュールを使用してこの問題を解決する方法について説明します。もちろん、それを無視することもできます。
ユーザーを追加するためのルートハンドラーは次のようになります。
post '/user/add' => {
my $args = valid_input('/user/add')
or return template('user/add');
my $user = User->new({
username => $args->{username},
# ...
});
user->insert; # you'll probably want some error handling here
set_flash('User added');
redirect '/user';
};
このvalid_input
関数は、CPANのData :: Form::Validatorモジュールを使用するアプリ用に作成したヘルパーです。引数は、使用する検証プロファイルの名前です。'/usr/add'
簡単にするために、ルート名と同じままにすることにしました。
ドキュメントはかなり良いので、Data :: Form::Validatorの呼び出しの詳細については退屈しません。私が言及するのは、検証が失敗した場合、valid_input
ヘルパーは検証エラーメッセージを保存してアラートボックスに表示し、送信されたパラメーターも保存することです。
my $q = params(); # need to force scalar context to get a hashref;
fill_in_form($q); # save submitted parameters
保存された検証エラーメッセージをテンプレートで利用できるようにするbefore_template_render
フックがあります(実際にはでレンダリングされますviews/layouts/main.tt
)。
また、保存された送信済みパラメーターを受け取り、 HTML::FillInFormモジュールafter_template_render
を使用してレンダリングされたHTMLフォームに戻すフックもあります。
そのインフラストラクチャが整っているので、すべてのフィールドが事前に入力された編集フォームで既存のユーザーレコードを表示するルートハンドラーは簡単です。
get '/user/:id' => sub {
if( my $user = User->find( param('id') ) ) {
fill_in_form($user);
return template 'user/edit', { id => $user->id };
}
not_found "User not found";
};
User
inUser->find()
は、私のアプリ固有のヘルパー関数の1つです。Dancer :: Plugin :: DBICモジュールを使用して、user
テーブルの結果セットオブジェクトを返します。
私は必ずしもData::Form::Validatorの大ファンではないと言います。やりたいことはすべて達成できましたが、思った以上に手間がかかることもあります。