On Sat, Jan 8, 2011 at 1:43 AM, Puneet Kishor <punk.kish@gmail.com> wrote:
Consider the most basic of workflows

   ## Perl
   get '/:foo_id.:format' => sub {
       my $foo_id = params->{foo_id};

       ## SQL
       my $sth = $dbh->prepare(qq{
           SELECT foo FROM table WHERE foo_id = ?
       });
       $sth->execute($foo_id);
       my ($foo) = $sth->fetchrow_array;

       to_json({data => $foo});
   };


   foo.tt
   ======
   <p>You got <span id="foo">[% foo %]</span></p>
   enter a number <input type="text" id="foo_id" name="foo_id">
   <input type="button" onclick="foo();">

   JavaScript
   ==========
   foo = function() {
       $.ajax({
           url     : "/server/" + $("#foo_id").val() + ".json",
           type    : "GET",
           data    : "",
           dataType: "json",
           error   : function() { alert("Error"); },
           success : function(data) {
               $("#foo").html(data.foo);
           }
       });
   }

       
If I change the table column 'foo' to 'bar' and 'foo_id' to 'bar_id', I have to change my Perl code (which includes SQL), my template and JavaScript. Obviously, this can get untenable very quickly as the application becomes complex. The obvious solution is to generate the template and the JavaScript on the server side, thereby having to declare all the names in just one place. I have recently learned of the Perl module Jemplate that might enable me to do this. But before I commit any cycles to it, I want to know how the other Dancers handle something like this.

another solution is to use DBIx::Class, where you can declare your schema with:

__PACKAGE__->add_columns( foo => {name => 'foo'}, ...);

and later change your schema to:

__PACKAGE__->add_columns(foo => {name => 'foo_id'}, ...);

so you don't have to change your code, only your schema.