Skip to content

Instantly share code, notes, and snippets.

@jjn1056
Last active July 28, 2022 20:15
Show Gist options
  • Save jjn1056/afd86882c19b05e7c96a72e91cfbfd7d to your computer and use it in GitHub Desktop.
Save jjn1056/afd86882c19b05e7c96a72e91cfbfd7d to your computer and use it in GitHub Desktop.
package Example::Controller::Register;
use Moose;
use MooseX::MethodAttributes;
use Example::Syntax;
extends 'Example::Controller';
has registration => (is=>'ro', lazy=>1, default=>sub($self) { $self->ctx->users->registration } );
has view => (is=>'ro', lazy=>1, default=>sub($self) { $self->ctx->view('HTML::Register', registration => $self->registration } );
sub root :Chained(/root) PathPart(register) Args(0) Does(Verbs) ($self, $c) {
return $c->redirect_to_action('#home') && $c->detach if $c->user->registered;
}
sub GET :Action ($self, $c) { return $self->view->set_http_ok }
sub POST :Action RequestModel(RegistrationRequest) ($self, $c, $request) {
$self->registration->register($request);
return $self->registration->valid ?
$c->redirect_to_action('#login') :
$self->view->set_http_bad_request;
}
__PACKAGE__->meta->make_immutable;
package Example::View::HTML::Register;
use Moose;
use Example::Syntax;
use Valiant::HTML::TagBuilder 'div', 'fieldset';
use Valiant::HTML::Form 'form_for';
extends 'Example::View::HTML';
has 'registration' => (is=>'ro', required=>1);
sub render($self, $c) {
$c->view('HTML::Layout' => page_title=>'Homepage', sub($layout) {
form_for $self->registration, +{method=>'POST', style=>'width:35em; margin:auto', csrf_token=>$c->csrf_token }, sub ($fb) {
fieldset [
$fb->legend,
div +{ class=>'form-group' },
$fb->model_errors(+{class=>'alert alert-danger', role=>'alert'}),
div +{ class=>'form-group' }, [
$fb->label('first_name'),
$fb->input('first_name', +{ class=>'form-control', errors_classes=>'is-invalid' }),
$fb->errors_for('first_name', +{ class=>'invalid-feedback' }),
],
div +{ class=>'form-group' }, [
$fb->label('last_name'),
$fb->input('last_name', +{ class=>'form-control', errors_classes=>'is-invalid' }),
$fb->errors_for('last_name', +{ class=>'invalid-feedback' }),
],
div +{ class=>'form-group' }, [
$fb->label('username'),
$fb->input('username', +{ class=>'form-control', errors_classes=>'is-invalid' }),
$fb->errors_for('username', +{ class=>'invalid-feedback' }),
],
div +{ class=>'form-group' }, [
$fb->label('password'),
$fb->password('password', +{ autocomplete=>'new-password', class=>'form-control', errors_classes=>'is-invalid' }),
$fb->errors_for('password', +{ class=>'invalid-feedback' }),
],
div +{ class=>'form-group' }, [
$fb->label('password_confirmation'),
$fb->password('password_confirmation', +{ class=>'form-control', errors_classes=>'is-invalid' }),
$fb->errors_for('password_confirmation', +{ class=>'invalid-feedback' }),
],
$fb->submit('Register for Account', +{class=>'btn btn-lg btn-primary btn-block'}),
],
},
});
}
__PACKAGE__->meta->make_immutable();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment