On 01/16/2013 11:39 AM, Jacinta wrote:
G'day folk,

I've been working through the Catalyst tutorial (again) and I decided to
give HTML::FormHandler a go. It's tutorial at
https://metacpan.org/module/GSHANK/HTML-FormHandler-0.40017/lib/HTML/FormHandler/Manual/Tutorial.pod
has been great.

However I am stuck on something I am certain should be easy, but is not
proving so...

As per the tutorial my edit method looks much like this:

    sub edit : Local {
    my ( $self, $c, $book_id ) = @_;

    $c->stash( template => 'books/edit.tt2',
    form => $self->form );

    # Validate and insert/update database
    return unless $self->form->process( item_id => $book_id,
    params => $c->req->parameters,
    schema => $c->model('DB')->schema );

    # Form validated, return to the books list
    $c->flash->{status_msg} = 'Book saved';
    $c->res->redirect($c->uri_for('list'));
    }


and that works beautifully. However, I've enhanced my examples as I've
gone along and instead of going to the list of books, I want to go to my
review page and print out all of the details (including extra stuff) of
this specific book I've just added.

So I would like to change the last line to be:

    $c->res->redirect($c->uri_for($self->action_for('review'), [$book_id]));


This works perfectly if I'm editing a book, but if I'm creating a book
for the first time, $book_id is undefined so I pass in an undefined id
to review. Review seems to deal with that okay:

    sub review :Chained('object') :PathPart('review') :Args(0) {
    my ($self, $c) = @_;

    my $book = $c->stash->{object};

    ...

until I want to use $book for something.

I have looked through most of the documentation for HTML::FormHandler
and I can't find anything that actually documents process() (it returns
1 on success) and I don't know the Catalyst stash well enough. Is this
information hiding therein or do I need to create a method to get the
last insert id?

All help gratefully appreciated.

Jacinta


_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Hi Jacinta,

Assumed that you are using HTML::FormHandler::Model::DBIC, HTML::FormHandler will store the new (or updated) item in the forms "item" attribute.

You can try this:

 my $new_id = $c->stash->{form}->item->id;
 $c->res->redirect($c->uri_for($self->action_for('review'), [$new_id]));

This code should work, no matter if the item was updated or created. It will even work if the items id changes during the update process (which should rarely happen, but it will work if it happens)


I hope I could help.
Lukas


_______________________________________________
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/

Reply via email to