HTML::FormHandler をフォーム プロセッサとして使用する Catalyst Perl MVC フレームワークを使用しています。
複数のオブジェクトを作成し、単一のフォームを使用して適切な個別のテーブルに保存する方法はありますか?
しばらくドキュメントを読み、最終的に IRC の助けを借りて、その方法を理解しました。とても簡単です。
「アカウント」と「ユーザー」という 2 つの関連テーブルがあるとします。そして「アカウント」には多くの「ユーザー」がいて、この関係を「ユーザー」と呼びます。
コントローラー Account.pm のコードは同じままです (フォームを処理して新しいオブジェクトを作成するために HTML::FormHandler を使用していることを思い出してください):
sub register : Chained('base') :PathPart('register') :Args(0) {
my ($self, $c ) = @_;
my $account = $c->model('DB::Account')->new_result({});
return $self->form_create($c, $account);
}
sub form_create {
my ( $self, $c, $account ) = @_;
my $form = MyApp::Form::Account->new();
$c->stash( template => 'account/form.tt2', form => $form );
$form->process( item => $account, params => $c->req->params );
return unless $form->validated;
}
lib/MyApp/Form/Account.pm でhttp://metacpan.org/pod/HTML::FormHandler::Field::Repeatableを使用するだけです。
package MyApp::Form::Account;
use HTML::FormHandler::Moose;
extends 'HTML::FormHandler::Model::DBIC';
use namespace::autoclean;
has '+item_class' => ( default => 'Account' );
has_field 'organization';
# other fields ...
# User Part Form
has_field 'users' => ( type => 'Repeatable' ); # 'users' is our relationship name!
has_field 'users.first';
has_field 'users.last';
# and so on...
has_field 'submit' => ( type => 'Submit', value => 'Submit' );
__PACKAGE__->meta->make_immutable;
1;
送信後、新しく作成された 'account' および 'user' オブジェクトを取得します。ここで、'user' には対応する 'account_id' が既に挿入されています:)
パラメータが検証されます
$ form-> process()
データは必要に応じてテーブルに挿入されます。
$ rec = $ c-> model(table_1)-> create(valid_data);
$ rec-> create_related('relationship_name'、related_data);
DBICに両方の挿入を自動的に実行させる方法を知りません。しかし、それは存在しないということではありません。FormHandler::DBICのドキュメントに何も表示されませんでした。