# Note: Above is a shortcut for this:
# $book->create_related('book_authors', {author_id => $author_id});
- # Assign the Book object to the stash for display in the view
- $c->stash->{book} = $book;
-
- # Set the TT template to use
- $c->stash->{template} = 'books/create_done.tt2';
+ # Assign the Book object to the stash for display and set template
+ $c->stash(book => $book,
+ template => 'books/create_done.tt2');
}
Notice that Catalyst takes "extra slash-separated information" from the
my ($self, $c) = @_;
# Store the ResultSet in stash so it's available for other methods
- $c->stash->{resultset} = $c->model('DB::Book');
+ $c->stash(resultset => $c->model('DB::Book'));
# Print a message to the debug log
$c->log->debug('*** INSIDE BASE METHOD ***');
my ($self, $c) = @_;
# Set the TT template to use
- $c->stash->{template} = 'books/form_create.tt2';
+ $c->stash(template => 'books/form_create.tt2');
}
This action simply invokes a view containing a form to create a book.
# Note: Above is a shortcut for this:
# $book->create_related('book_authors', {author_id => $author_id});
- # Store new model object in stash
- $c->stash->{book} = $book;
-
# Avoid Data::Dumper issue mentioned earlier
# You can probably omit this
$Data::Dumper::Useperl = 1;
- # Set the TT template to use
- $c->stash->{template} = 'books/create_done.tt2';
+ # Store new model object in stash and set template
+ $c->stash(book => $book,
+ template => 'books/create_done.tt2');
}
Point your browser to L<http://localhost:3000/books/list> (you should
now be able to safely hit "refresh" in your browser). Then delete the
remaining copy of "TCPIP_Illustrated_Vol-2". The green "Book deleted"
-status message should return.
+status message should return. But notice that you can now hit the
+"Reload" button in your browser and it just redisplays the book
+list (and it correctly shows it without the "Book deleted" message
+on redisplay).
B<NOTE:> Another popular method for maintaining server-side
information across a redirect is to use the C<flash> technique we
5|Designing with Web Standards|5|2010-02-16 04:15:45|2010-02-16 04:15:45
9|TCP/IP Illustrated, Vol 3|5|2010-02-16 04:15:45|2010-02-16 04:15:45
10|TCPIP_Illustrated_Vol-2|5|2010-02-16 04:18:42|2010-02-16 04:18:42
+ sqlite> .q
Notice in the debug log that the SQL DBIC generated has changed to
incorporate the datetime logic:
# Retrieve all of the book records as book model objects and store in the
# stash where they can be accessed by the TT template, but only
# retrieve books created within the last $min number of minutes
- $c->stash->{books} = [$c->model('DB::Book')
- ->created_after(DateTime->now->subtract(minutes => $mins))];
+ $c->stash(books => [$c->model('DB::Book')
+ ->created_after(DateTime->now->subtract(minutes => $mins))]);
# Set the TT template to use. You will almost always want to do this
# in your action methods (action methods respond to user input in
# your controllers).
- $c->stash->{template} = 'books/list.tt2';
+ $c->stash(template => 'books/list.tt2');
}
Now try different values for the "minutes" argument (the final number
http://localhost:3000/books/list_recent/15
Depending on how recently you added books, you might want to
-try a higher or lower value.
+try a higher or lower value for the minutes.
=head2 Chaining ResultSets
# stash where they can be accessed by the TT template, but only
# retrieve books created within the last $min number of minutes
# AND that have 'TCP' in the title
- $c->stash->{books} = [$c->model('DB::Book')
+ $c->stash(books => [$c->model('DB::Book')
->created_after(DateTime->now->subtract(minutes => $mins))
->search({title => {'like', '%TCP%'}})
- ];
+ ]);
# Set the TT template to use. You will almost always want to do this
# in your action methods (action methods respond to user input in
# your controllers).
- $c->stash->{template} = 'books/list.tt2';
+ $c->stash(template => 'books/list.tt2');
}
To try this out, enter the following URL into your browser:
# stash where they can be accessed by the TT template, but only
# retrieve books created within the last $min number of minutes
# AND that have 'TCP' in the title
- $c->stash->{books} = [$c->model('DB::Book')
+ $c->stash(books => [$c->model('DB::Book')
->created_after(DateTime->now->subtract(minutes => $mins))
->title_like('TCP')
- ];
+ ]);
# Set the TT template to use. You will almost always want to do this
# in your action methods (action methods respond to user input in
# your controllers).
- $c->stash->{template} = 'books/list.tt2';
+ $c->stash(template => 'books/list.tt2');
}
Try out the C<list_recent_tcp> and C<list_recent> URLs as we did above.
always, it must be above the closing "C<1;>"):
#
- # Helper methods
+ # Row-level helper methods
#
sub full_name {
my ($self) = @_;