X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?p=catagits%2FCatalyst-Manual.git;a=blobdiff_plain;f=lib%2FCatalyst%2FManual%2FTutorial%2F04_BasicCRUD.pod;h=f7f5f1b76371adf1d3cce17568a1ece5c8e1f074;hp=8506531946fa7954904aa222740189fa67c2a37d;hb=4768184b3b277399116fbd53cae3697a9767fee5;hpb=f2bbfc36c84341b93dd37dceb879a94743a90b18 diff --git a/lib/Catalyst/Manual/Tutorial/04_BasicCRUD.pod b/lib/Catalyst/Manual/Tutorial/04_BasicCRUD.pod index 8506531..f7f5f1b 100644 --- a/lib/Catalyst/Manual/Tutorial/04_BasicCRUD.pod +++ b/lib/Catalyst/Manual/Tutorial/04_BasicCRUD.pod @@ -116,11 +116,9 @@ Edit C and enter the following method: # 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 @@ -359,9 +357,8 @@ to the following: | /books/url_create | /books/url_create | '-------------------------------------+--------------------------------------' -Now start the development server with our basic chained method in -place and the startup debug output should change to something along -the lines of the following: +When the development server restarts, the debug output should change +to something along the lines of the following: [debug] Loaded Path actions: .-------------------------------------+--------------------------------------. @@ -413,7 +410,7 @@ method: 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 ***'); @@ -495,7 +492,7 @@ Edit C and add the following 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. @@ -549,15 +546,13 @@ save the form information to the database: # 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'); } @@ -909,7 +904,10 @@ Cspan class="message"E> line. Point your browser to L (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 Another popular method for maintaining server-side information across a redirect is to use the C technique we @@ -940,8 +938,8 @@ Let's add two columns to our existing C table to track when each book was added and when each book is updated: $ sqlite3 myapp.db - sqlite> ALTER TABLE book ADD created INTEGER; - sqlite> ALTER TABLE book ADD updated INTEGER; + sqlite> ALTER TABLE book ADD created TIMESTAMP; + sqlite> ALTER TABLE book ADD updated TIMESTAMP; sqlite> UPDATE book SET created = DATETIME('NOW'), updated = DATETIME('NOW'); sqlite> SELECT * FROM book; 1|CCSP SNRS Exam Certification Guide|5|2010-02-16 04:15:45|2010-02-16 04:15:45 @@ -992,9 +990,9 @@ B the C<1;> on the last line): # __PACKAGE__->add_columns( "created", - { data_type => 'datetime', set_on_create => 1 }, + { data_type => 'timestamp', set_on_create => 1 }, "updated", - { data_type => 'datetime', set_on_create => 1, set_on_update => 1 }, + { data_type => 'timestamp', set_on_create => 1, set_on_update => 1 }, ); This will override the definition for these fields that Schema::Loader @@ -1020,6 +1018,7 @@ time entered for it (see the last line in the listing below): 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: @@ -1086,13 +1085,13 @@ Then add the following method to the C: # 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 @@ -1103,7 +1102,7 @@ fifteen minutes: 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 @@ -1136,15 +1135,15 @@ C and add the following method: # 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: @@ -1203,15 +1202,15 @@ shown here -- the rest of the method should be the same): # 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 and C URLs as we did above. @@ -1233,7 +1232,7 @@ C and add the following method (as always, it must be above the closing "C<1;>"): # - # Helper methods + # Row-level helper methods # sub full_name { my ($self) = @_; @@ -1385,5 +1384,5 @@ Please report any errors, issues or suggestions to the author. The most recent version of the Catalyst Tutorial can be found at L. -Copyright 2006-2008, Kennedy Clark, under Creative Commons License +Copyright 2006-2010, Kennedy Clark, under Creative Commons License (L).