tower-archive / tower

UNMAINTAINED - Small components for building apps, manipulating data, and automating a distributed infrastructure.
http://tower.github.io
MIT License
1.79k stars 120 forks source link

Sessions and mysql/postgres #356

Closed 1xizt closed 10 years ago

1xizt commented 11 years ago

Hi, I'm not clear on how to use sessions and mysql or postgres. The latter seem to be a work in progress, any idea on timeline? Framework looks very promising, v good initiative/direction. Love the view template methodology.

thehydroimpulse commented 11 years ago

I believe only MongoDB is supported as of now, but there are plans for other databases to be included. Sessions are used within controllers and it uses the expressjs / connect sessions.

You can access the session object through the request object in any controller:

request.session
1xizt commented 11 years ago

Thanks. MongoDB is great, only not acid compliant for ecommerce type transactions. Would that be right? I've been learning coffeescript to use with tower.js, its surprisingly elegant and close to english.

On Nov 23, 2012, at 8:46 PM, Daniel wrote:

I believe only MongoDB is supported as of now, but there are plans for other databases to be included. Sessions are used within controllers and it uses the expressjs / connect sessions.

You can access the session object through the request object in any controller:

request.session — Reply to this email directly or view it on GitHub.

lancejpollard commented 11 years ago

@1xizt you're right, MongoDB is great but it's not acid compliant for ecommerce type transactions. Glad to hear you're enjoying coffeescript :)

If you'd like to take a swing at making a SQL adapter for Tower, let me know. It should be easy to do, the main thing that needs to be done is parsing the SQL command strings. But I think that's already been done somewhere in the node community, so all you'd really need to do is plugin their parser, and plug that into Tower. I'll work with you on that if you're interested, let me know!

Here's some notes on how to create a custom store:

https://github.com/viatropos/tower/wiki/Creating-a-Custom-Store-in-Tower

You can tinker with them here (I've created the classes w/o implementation so far):

https://github.com/viatropos/tower/tree/master/packages/tower-store/server

As a side note, having a SQL adapter would also make it possible to use SQLite in the browser, which would be cool for client-side-only demos.

Some examples:

If you find any better parsers/examples, please post.

1xizt commented 11 years ago

Hi Lance, I'd be happy to give it a shot. Just bear in mind I'm a js noob with the exception of using jquery plugins for years and coding for transitions, etc.

Started reading up on Coffeescript last night, looks v neat, easy to understand. Little Book of Coffeescript v helpful. So I'd be happy to try it out, it will be a learning experience.

I saw a mysql node adapter at which looks pretty solid:

https://github.com/felixge/node-mysql

And there's a bunch more at:

https://github.com/joyent/node/wiki/modules#wiki-web-frameworks-full

Any particular one you'd like me to try? I'll email you if I have any ?, for sure I will :)

On Nov 24, 2012, at 6:31 AM, Lance Pollard wrote:

@1xizt you're right, MongoDB is great but it's not acid compliant for ecommerce type transactions. Glad to hear you're enjoying coffeescript :)

If you'd like to take a swing at making a SQL adapter for Tower, let me know. It should be easy to do, the main thing that needs to be done is parsing the SQL command strings. But I think that's already been done somewhere in the node community, so all you'd really need to do is plugin their parser, and plug that into Tower. I'll work with you on that if you're interested, let me know!

— Reply to this email directly or view it on GitHub.

1xizt commented 11 years ago

Would it make sense maybe to use Sequelze as it already supports mysql, postgres and sqllite?

https://github.com/sdepold/sequelize

On Nov 24, 2012, at 6:31 AM, Lance Pollard wrote:

@1xizt you're right, MongoDB is great but it's not acid compliant for ecommerce type transactions. Glad to hear you're enjoying coffeescript :)

If you'd like to take a swing at making a SQL adapter for Tower, let me know. It should be easy to do, the main thing that needs to be done is parsing the SQL command strings. But I think that's already been done somewhere in the node community, so all you'd really need to do is plugin their parser, and plug that into Tower. I'll work with you on that if you're interested, let me know!

— Reply to this email directly or view it on GitHub.

lancejpollard commented 11 years ago

Awesome that would be great! Sequelize looks perfect. Looking at the package.json it looks like it loads node-mysql and can load the popular sqlite and postgres node libs as well.

It seems that you could combine sequelize with squel (for building the SQL query strings), and then wrap each db with with a Tower.MysqlStore, Tower.PostgresStore, etc.

Looking quickly at node-mysql and sequelize, it doesn't seem there is a clean way to build the SQL string, which is why I recommended squel. But if sequelize does support it, then you would only need that.

To connect this with tower, you would just create a custom store (from that wiki link above). See the memory and mongodb stores in the tower source code for examples.

The real meat comes in with the cursor, which is passed in as the first argument to find, insert, update, destroy, count, and exists. The cursor is a Tower.ModelCursor instance. This is the return value from common API calls such as:

App.User.all()
App.User.where(active: true).count()

Basically, when you call App.Model.where or any other "chainable scope" methods (borrowing the Rails term), it internally keeps a "cursor" object that contains all of the query parameters you pass into where/order/page/etc. Once you call all, find, create, update, destroy, count, exists on that "chainable scope", it "compiles" the query parameters into the cursor, and passes that to the specific database's (Tower.Store instance) corresponding method.

Note, the Tower.ModelScope api (which just wraps the Tower.ModelCursor API, it's pretty much just there for the DSL), adds the additional method all, and uses create instead of insert. It also has first and last. The Tower.Store only has find, insert, update, destroy, count, and exists. This is because all, find, first, and last on the Tower.ModelCursor are just sugar syntax; for example, first just adds limit: 1 to the cursor just before passing it to the Tower.Store.

So all you need to know is that, in your custom store, the first argument to those 6 methods is a Tower.ModelCursor. From that, you can call cursor.toParams() and it will compile it to a simple hash such as:

{
  sort: [['createdAt', 'desc']],
  page: 2,
  conditions: {
    firstName: 'John',
    active: true,
    createdAt: {'>=': Date(Nov 19, 2012)}
  },
  limit: 20
}

See the Tower.MongodbStoreSerializer for examples of how to manipulate the cursor's params. Basically, you would just go through the cursor.toParams().conditions hash, and pass it to the squel query string builder.

store = this;

squel.select()
  .from(_.camelize(store.className), "*")
  .where(prop, val)

Then pass that query string to sequelize!

So (a simple/pseudo) Tower.MysqlStore#find might look like this:

class Tower.MysqlStore extends Tower.Store
  find: (cursor, callback) ->
    params = cursor.toParams()
    conditions = params.conditions

    queryString = require('squel').where(conditions)

    require('sequelize').execute queryString, (error, rows) =>
      for row, i in rows
        rows[i] = @serializeModel(row) # constructs model instance, see superclass

      callback(null, rows)

Let me know if you have any questions, I'll be here.

1xizt commented 11 years ago

Thanks for the input Lance, will look through it. Only reason I need mysql or postgres is for ecommerce where we need ACID compliant transactions.

Otherwise I could have prob got by on mongodb, which btw is my first foray into the nosql world. I'm bored in the coldfusion world, they're just not progressive in terms of MVC, rest, no sql, best use of js on client side, etc. I kept looking at ruby on rails world for inspiration, but rails is a bit flakey for deployment and I'm not as close to the metal as I'd like to be.

So anyhow, this server/client side world all on the same language and using coffee script and coffee cup looks v compelling. Some v nice default choices made. Only point of diff is stylus vs sass, but its not a biggie, v minor diff. Both do the same thing anyhow.

On Nov 24, 2012, at 3:17 PM, Lance Pollard wrote:

Awesome that would be great! Sequelize looks perfect. Looking at the package.json it looks like it loads node-mysql and can load the popular sqlite and postgres node libs as well.

It seems that you could combine sequelize with squel (for building the SQL query strings), and then wrap each db with with a Tower.MysqlStore, Tower.PostgresStore, etc.

Looking quickly at node-mysql and sequelize, it doesn't seem there is a clean way to build the SQL string, which is why I recommended squel. But if sequelize does support it, then you would only need that.

To connect this with tower, you would just create a custom store (from that wiki link above). See the memory and mongodb stores in the tower source code for examples.

The real meat comes in with the cursor, which is passed in as the first argument to find, insert, update, destroy, count, and exists. The cursor is a Tower.ModelCursor instance. This is the return value from common API calls such as:

App.User.all() App.User.where(active: true).count() Basically, when you call App.Model.where or any other "chainable scope" methods (borrowing the Rails term), it internally keeps a "cursor" object that contains all of the query parameters you pass into where/order/page/etc. Once you call all, find, create, update, destroy, count, exists on that "chainable scope", it "compiles" the query parameters into the cursor, and passes that to the specific database's (Tower.Store instance) corresponding method.

Note, the Tower.ModelScope api (which just wraps the Tower.ModelCursor API, it's pretty much just there for the DSL), adds the additional method all, and uses create instead of insert. It also has first and last. The Tower.Store only has find, insert, update, destroy, count, and exists. This is because all, find, first, and last on the Tower.ModelCursor are just sugar syntax; for example, first just adds limit: 1 to the cursor just before passing it to the Tower.Store.

So all you need to know is that, in your custom store, the first argument to those 6 methods is a Tower.ModelCursor. From that, you can call cursor.toParams() and it will compile it to a simple hash such as:

{ sort: [['createdAt', 'desc']], page: 2, conditions: { firstName: 'John', active: true, createdAt: {'>=': Date(Nov 19, 2012)} }, limit: 20 } See the Tower.MongodbStoreSerializer for examples of how to manipulate the cursor's params. Basically, you would just go through the cursor.toParams().conditions hash, and pass it to the squel query string builder.

store = this;

squel.select() .from(_.camelize(store.className), "*") .where(prop, val) Then pass that query string to sequelize!

Let me know if you have any questions, I'll be back later today.

— Reply to this email directly or view it on GitHub.

1xizt commented 11 years ago

Btw, a lot of what you said is double dutch, but I will figure it out. I want to stretch and grow as a coder. Coldfusion was a fantastic language, v user friendly, super elegant syntax, however it shields you from a lot of coding practices like using classes, arrays and json. Even its json output isn't standard the way jquery likes it, I could work around it but its time to move on.

I found Zurb Foundation so that settles my grid as its really slick on the responsive front. Leaning on knockout.js for bindings at the mo, sass for css. Rest is wide open.

Would you say Tower is ready for production or a month or two away?

On Nov 24, 2012, at 3:17 PM, Lance Pollard wrote:

Awesome that would be great! Sequelize looks perfect. Looking at the package.json it looks like it loads node-mysql and can load the popular sqlite and postgres node libs as well.

It seems that you could combine sequelize with squel (for building the SQL query strings), and then wrap each db with with a Tower.MysqlStore, Tower.PostgresStore, etc.

Looking quickly at node-mysql and sequelize, it doesn't seem there is a clean way to build the SQL string, which is why I recommended squel. But if sequelize does support it, then you would only need that.

To connect this with tower, you would just create a custom store (from that wiki link above). See the memory and mongodb stores in the tower source code for examples.

The real meat comes in with the cursor, which is passed in as the first argument to find, insert, update, destroy, count, and exists. The cursor is a Tower.ModelCursor instance. This is the return value from common API calls such as:

App.User.all() App.User.where(active: true).count() Basically, when you call App.Model.where or any other "chainable scope" methods (borrowing the Rails term), it internally keeps a "cursor" object that contains all of the query parameters you pass into where/order/page/etc. Once you call all, find, create, update, destroy, count, exists on that "chainable scope", it "compiles" the query parameters into the cursor, and passes that to the specific database's (Tower.Store instance) corresponding method.

Note, the Tower.ModelScope api (which just wraps the Tower.ModelCursor API, it's pretty much just there for the DSL), adds the additional method all, and uses create instead of insert. It also has first and last. The Tower.Store only has find, insert, update, destroy, count, and exists. This is because all, find, first, and last on the Tower.ModelCursor are just sugar syntax; for example, first just adds limit: 1 to the cursor just before passing it to the Tower.Store.

So all you need to know is that, in your custom store, the first argument to those 6 methods is a Tower.ModelCursor. From that, you can call cursor.toParams() and it will compile it to a simple hash such as:

{ sort: [['createdAt', 'desc']], page: 2, conditions: { firstName: 'John', active: true, createdAt: {'>=': Date(Nov 19, 2012)} }, limit: 20 } See the Tower.MongodbStoreSerializer for examples of how to manipulate the cursor's params. Basically, you would just go through the cursor.toParams().conditions hash, and pass it to the squel query string builder.

store = this;

squel.select() .from(_.camelize(store.className), "*") .where(prop, val) Then pass that query string to sequelize!

Let me know if you have any questions, I'll be back later today.

— Reply to this email directly or view it on GitHub.

thehydroimpulse commented 11 years ago

I'd say it's a couple months away. Though you can use it now, there are some bugs, and lots of features that are missing. The client-side stuff right now, especially the router isn't finished, but that'll change when the new stuff drops in. Also, there might be several improvements to be made, speed wise, as I've never profiled Tower, yet, that's another thing on the list.

thehydroimpulse commented 11 years ago

But, I'll also add, that you can start using Tower for your project, and when new features or changes come into the mix, you can simply change were needed. Though that all depends on the length of your project.

1xizt commented 11 years ago

I think what I'll do right now is launch in coldfusion, and then port over in Jan or Feb. I need to go live with it, but I'll build a mirror in Tower so its easy to port when we get everything polished up.

Btw, do you have auto crf creation for forms?

Maybe an auto admin panel ala Django, that kinda stuff gets ppl horny :)

Also Twitter Bootstrap or Zurb Foundation as default css layout libraries. Having tried both, I much prefer Foundation for the grid, its really slick in that you can code the same view for mobile at the same time. It adapts pretty well for tablets and phones.

Thing I like most about what you did in Tower is extensive use of coffeescript, that's such a cool user friendly tool. And coffee cup for layouts as I'm a fan of HAML, but there's no equivalent for it in the coldfusion world. Those guys have an open source engine better than Adobe's commercial version, but again they're not really following the smartest design patterns, they leave it up to other folks and that community just ain't as progressive as the rails crowd.

The app I launch with in meantime, would you recommend doing it in rails instead of coldfusion, or rails not ideal in your opinion despite the hype?

On Nov 24, 2012, at 3:40 PM, Daniel wrote:

But, I'll also add, that you can start using Tower for your project, and when new features or changes come into the mix, you can simply change were needed. Though that all depends on the length of your project.

— Reply to this email directly or view it on GitHub.

edubkendo commented 11 years ago

awesome @1xizt I'm sure you'll figure it out. It will be great for someone to finally add support for another database. I am HIGHLY interested in graph db's like neo4j , as is @viatropos , so this is exciting.

thehydroimpulse commented 11 years ago

Personally, I'd go with Rails and Ember.js, though, if you'd have to spend lots of time learning all the stuff, then stick to Coldfusion. If you already have your app in Ember.js, then porting is, or will be, extremely easy, as Tower is built on Ember.js. That's what I'm personally doing atm for a number of projects, though I'm using nodejs as the backend.

There are plans to have an admin panel generator or module similar to ActiveAdmin, though, that's a long ways away.

I believe there was another issue opened with concern about using Zurb Foundation, instead of Twitter Bootstrap.

1xizt commented 11 years ago

Gotcha, I found knockout.js easier to understand than ember, but I can make the effort to figure it out.

What was the issue on Foundation. The main thing I like about is the grid, I mixed in widgets from Bootstrap into the Foundation grid to get best of both worlds.

I know rails fairly well, I spent some time getting familiar with it. So may just go that route for the educational value.

On Nov 24, 2012, at 4:03 PM, Daniel wrote:

Personally, I'd go with Rails and Ember.js, though, if you'd have to spend lots of time learning all the stuff, then stick to Coldfusion. If you already have your app in Ember.js, then porting is, or will be, extremely easy, as Tower is built on Ember.js. That's what I'm personally doing atm for a number of projects, though I'm using nodejs as the backend.

There are plans to have an admin panel generator or module similar to ActiveAdmin, though, that's a long ways away.

I believe there was another issue opened with concern about using Zurb Foundation, instead of Twitter Bootstrap.

— Reply to this email directly or view it on GitHub.

thehydroimpulse commented 11 years ago

I'm not that familiar with knockout, but it's not as complete as Ember.js is. It also tightly bound to DOM elements, which I personally hate. Because of some missing pieces, some people have to implement those themselves. That's why I love Ember so much. It's fully featured and all the pieces are there.

1xizt commented 11 years ago

What resources did you tap into to compress your learning curve on ember? That's by Katz right?

On Nov 24, 2012, at 4:20 PM, Daniel wrote:

I'm not that familiar with knockout, but it's not as complete as Ember.js is. It also tightly bound to DOM elements, which I personally hate. Because of some missing pieces, some people have to implement those themselves. That's why I love Ember so much. It's fully featured and all the pieces are there.

— Reply to this email directly or view it on GitHub.

thehydroimpulse commented 11 years ago

Probably this article helped a lot: http://trek.github.com/ . It's made by Trek, one of the core members of Ember. I think the Router, Templates, Contexts, Views, and Outlets are the hardest thing to comprehend. Outlets, I'll tell you right now, is the SIMPLEST thing once you get it. Outlets are view holdplacers.

Meaning, if you have a main page with a header and a body, well the header wouldn't change across the other pages, only the body content would. So you would place an outlet {{outlet}} where you want your body content of the different pages to appear.

<!DOCTYPE html>
<html>
  <head>
    <title>Random Title</title>
  </head>
  <body>
        <div id="wrapper">
           <script type="text/x-handlebars" data-template-name="application">
               <header><!-- header stuff --></header>
               <div id="content">{{outlet}}</div>
           </script>
        </div>
        <!-- Scripts to load ember, jquery, handlebars -->
  </body>
</html>

Then, in the router you would "connect" the outlet(s) (you can have more than one outlet, for example, sidebars), to the appropriate template.

App.Router = Ember.Router.extend({
  root: Ember.Route.extend({
    index: Ember.Route.extend({
       route: "/",

       connectOutlets: function(router) {
           // Connect the {{outlet}} in the "application" template to the "home" template.
           // In simpler terms... Grab the contents of the "home" template and replace the {{outlet}} in the "application" template with it.
           router.get('applicationController').connectOutlet('home'); 
       } 
    });
  });
});

You would do this for all the different routes. Again, pretty simple, but it stays simple for complex applications. Once you understand the object system, router, contexts, outlets, and views, you'll find it extremely awesome.

I'm starting to make Ember.js tutorials on my Youtube channel, as there are none atm. Maybe that'll help some people out.

1xizt commented 11 years ago

Thanks, that makes sense ref the outlets. I'll just have to bite the bullet and obsess on it till I get that aha moment. Appreciate the tips. I was planning on avoiding it altogether having read articles comparing it to knockout and angular, but if its a tower universe and you guys settled on it, that's the route I'll go so we're in sync, smoothest path forward.

On Nov 24, 2012, at 4:41 PM, Daniel wrote:

Probably this article helped a lot: http://trek.github.com/ . It's made by Trek, one of the core members of Ember. I think the Router, Templates, Contexts, Views, and Outlets are the hardest thing to comprehend. Outlets, I'll tell you right now, is the SIMPLEST thing once you get it. Outlets are view holdplacers.

Meaning, if you have a main page with a header and a body, well the header wouldn't change across the other pages, only the body content would. So you would place an outlet {{outlet}} where you want your body content of the different pages to appear.

<!DOCTYPE html>

Random Title

Then, in the router you would "connect" the outlet(s) (you can have more than one outlet, for example, sidebars), to the appropriate template.

App.Router = Ember.Router.extend({ root: Ember.Route.extend({ index: Ember.Route.extend({ route: "/",

   connectOutlets: function(router) {
       // Connect the {{outlet}} in the "application" template to the "home" template.
       // In simpler terms... Grab the contents of the "home" template and replace the {{outlet}} in the "application" template with it.
       router.get('applicationController').connectOutlet('home'); 
   } 
});

}); }); You would do this for all the different routes. Again, pretty simple, but it stays simple for complex applications. Once you understand the object system, router, contexts, outlets, and views, you'll find it extremely awesome.

I'm starting to make Ember.js tutorials on my Youtube channel, as there are none atm. Maybe that'll help some people out.

— Reply to this email directly or view it on GitHub.

thehydroimpulse commented 11 years ago

No Problem! If you want a little more insight on comparisons of Ember.js and other frameworks, http://www.quora.com/Ember-js/Which-one-of-angular-js-and-ember-js-is-the-better-choice is an AWESOME read. The answer (main / first one) is written by Tom Dale, one of the core members of Ember.js, an ex-Apple employee that also created SproutCore that was the framework used in huge apps like iCloud, which they (Tom, and Yehuda - another Ember dev) also created.

AngularJS and Knockout have a lot of similarities, especially in their bindings.

Tom Dale also wrote a blog post explaining their [Ember.js] implementation of the Router. http://tomdale.net/2012/05/ember-routing/

A very interesting read, and it shows just how powerful it is. I haven't spent much time with Angular's router, nor Knockout, but Angular uses a Rails like routing, which I don't think is front-end friendly.

1xizt commented 11 years ago

Thanks, much appreciated, will check it out. I was just thinking today, for how disinterested I was in studying at school, I've done nothing but studying and reading since I started coding. I always thought at some point I'll be done but about a year ago I got comfy with the concept of perpetual learning as a desirable virtue and pleasure vs a pain :) Net dev is quite inspiring in terms of rate of progressiveness and generosity. So ember it is, I'll crack the nut, there's a nice vid on Peepcode with Katz also, will get that.

On Nov 24, 2012, at 5:20 PM, Daniel wrote:

No Problem! If you want a little more insight on comparisons of Ember.js and other frameworks, http://www.quora.com/Ember-js/Which-one-of-angular-js-and-ember-js-is-the-better-choice is an AWESOME read. The answer (main / first one) is written by Tom Dale, one of the core members of Ember.js, an ex-Apple employee that also created SproutCore that was the framework used in huge apps like iCloud, which they (Tom, and Yehuda - another Ember dev) also created.

AngularJS and Knockout have a lot of similarities, especially in their bindings.

Tom Dale also wrote a blog post explaining their [Ember.js] implementation of the Router. http://tomdale.net/2012/05/ember-routing/

A very interesting read, and it shows just how powerful it is. I haven't spent much time with Angular's router, nor Knockout, but Angular uses a Rails like routing, which I don't think is front-end friendly.

— Reply to this email directly or view it on GitHub.

1xizt commented 11 years ago

Sorry for the delay buddy, I've been doing some research on the drivers for mysql and postgres. I'm buried to my neck in a large scale email app with a bunch of admin functions. Can you guys bear with me for a week so I can get back to solving this part of the puzzle?

I did look at angular and ember in more details, to me still angular looks more powerful and simpler. I am going through the link on Quora to get a better understanding. Prob I'll have to try both to get a real world feel. I really like most of the choices you've made on toolset in Tower tho, especially use of Coffeescript and haml style layouts.

On Nov 24, 2012, at 5:20 PM, Daniel wrote:

No Problem! If you want a little more insight on comparisons of Ember.js and other frameworks, http://www.quora.com/Ember-js/Which-one-of-angular-js-and-ember-js-is-the-better-choice is an AWESOME read. The answer (main / first one) is written by Tom Dale, one of the core members of Ember.js, an ex-Apple employee that also created SproutCore that was the framework used in huge apps like iCloud, which they (Tom, and Yehuda - another Ember dev) also created.

AngularJS and Knockout have a lot of similarities, especially in their bindings.

Tom Dale also wrote a blog post explaining their [Ember.js] implementation of the Router. http://tomdale.net/2012/05/ember-routing/

A very interesting read, and it shows just how powerful it is. I haven't spent much time with Angular's router, nor Knockout, but Angular uses a Rails like routing, which I don't think is front-end friendly.

— Reply to this email directly or view it on GitHub.

edubkendo commented 11 years ago

Definitely interested in seeing what you do with this @1xizt . Of course it's understandable that you are busy. Keep at it though. Will be awesome to see SQL-db's working with tower.

As far as Angular, it probably is much simpler than ember, but there's no way it is more powerful. Sometimes simplicity = power, but in this case I'd say the opposite is true. Ember solves and simplifies a whole host of very difficult, complex problems. In doing so it simplifies them, but it can only simplify them so much. Other frameworks appear to be simpler, but only because they completely fail to address (or deliberately choose not to address) some of the problems that Ember addresses quite well. This particular talk by @tomdale (one of Ember's core contrib's) is about ember-data. Tower doesn't need ember-data because it has its own models which fulfill that function, but, I think the talk demonstrates very well some of the very hard problems ember chooses to address that other frameworks do not. There is definitely a place in the world for simpler frameworks like angular and backbone, but what emerges from the synthesis of tower and ember is a full-stack solution to web development that makes hard problems like real-time data syncing, url/browser history and programatic state, sharing models between client and server, and I'm sure @viatropos could give you a much longer list. Even our routing solution, when it's complete, will draw on ember to make it super simple to use a single router for both server and client if desired (as i understand the current design plans). Without ember, tower would basically be a rails clone on node.js, to put it quite bluntly (a really , really fast rails clone with built in websocket support and a bunch of other cool stuff, but still, a rails clone). And ember would be ( is ) a very nice client-side framework that solves a lot of problems. But damn when you put the two together, like viatropos painstakingly did over the summer, makes for something completely new, something that will simplify web application development in a way that nothing currently available can do.

On Sun, Dec 16, 2012 at 11:30 PM, 1xizt notifications@github.com wrote: Sorry for the delay buddy, I've been doing some research on the drivers for mysql and postgres. I'm buried to my neck in a large scale email app with a bunch of admin functions. Can you guys bear with me for a week so I can get back to solving this part of the puzzle?

I did look at angular and ember in more details, to me still angular looks more powerful and simpler. I am going through the link on Quora to get a better understanding. Prob I'll have to try both to get a real world feel. I really like most of the choices you've made on toolset in Tower tho, especially use of Coffeescript and haml style layouts.

thehydroimpulse commented 11 years ago

Angular is by far more complex, especially in it's terms and theoretical background. But that doesn't mean it's more, or less powerful. Both Ember.js and Angular are just as powerful, though, they some of them are better at some tasks then others.