Skip to content

Commit

Permalink
Fixed mvc example
Browse files Browse the repository at this point in the history
  • Loading branch information
tj committed Nov 25, 2010
1 parent 98e1823 commit 6f2120b
Show file tree
Hide file tree
Showing 7 changed files with 182 additions and 185 deletions.
12 changes: 6 additions & 6 deletions examples/mvc/controllers/app.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@

module.exports = {
// /
index: function(req, res){
res.render();
}

// /

index: function(req, res){
res.render();
}
};
84 changes: 42 additions & 42 deletions examples/mvc/controllers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,54 +2,54 @@
// Fake user database for example

var users = [
{ id: 0, name: 'TJ', email: 'tj@vision-media.ca' },
{ id: 1, name: 'Simon', email: 'simon@vision-media.ca' }
{ id: 0, name: 'TJ', email: 'tj@vision-media.ca' }
, { id: 1, name: 'Simon', email: 'simon@vision-media.ca' }
];

function get(id, fn) {
if (users[id]) {
fn(null, users[id]);
} else {
fn(new Error('User ' + id + ' does not exist'));
}
if (users[id]) {
fn(null, users[id]);
} else {
fn(new Error('User ' + id + ' does not exist'));
}
}

module.exports = {
// /users
index: function(req, res){
res.render(users);
},

// /users

index: function(req, res){
res.render(users);
},

// /users/:id
// /users/:id

show: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},
// /users/:id/edit
edit: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},
// PUT /users/:id
update: function(req, res, next){
var id = req.params.id;
get(id, function(err){
if (err) return next(err);
var user = users[id] = req.body.user;
user.id = id;
req.flash('info', 'Successfully updated _' + user.name + '_.');
res.redirect('back');
});
}
show: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},

// /users/:id/edit

edit: function(req, res, next){
get(req.params.id, function(err, user){
if (err) return next(err);
res.render(user);
});
},

// PUT /users/:id

update: function(req, res, next){
var id = req.params.id;
get(id, function(err){
if (err) return next(err);
var user = users[id] = req.body.user;
user.id = id;
req.flash('info', 'Successfully updated _' + user.name + '_.');
res.redirect('back');
});
}
};
237 changes: 117 additions & 120 deletions examples/mvc/mvc.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,149 +3,146 @@
* Module dependencies.
*/

var fs = require('fs'),
express = require('../../lib/express');
var fs = require('fs')
, express = require('../../lib/express');

exports.boot = function(app){
bootApplication(app);
bootControllers(app);
bootApplication(app);
bootControllers(app);
};

// App settings and middleware

function bootApplication(app) {
app.use(express.logger({ format: ':method :url :status' }));
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
app.use(express.session());
app.use(app.router);
app.use(express.staticProvider(__dirname + '/public'));

// Example 500 page
app.error(function(err, req, res){
console.dir(err)
res.render('500');
});

// Example 404 page via simple Connect middleware
app.use(function(req, res){
res.render('404');
});

// Setup ejs views as default, with .html as the extension
app.set('views', __dirname + '/views');
app.register('.html', require('ejs'));
app.set('view engine', 'html');

// Some dynamic view helpers
app.dynamicHelpers({
request: function(req){
return req;
},

hasMessages: function(req){
return Object.keys(req.session.flash || {}).length;
},

messages: function(req){
return function(){
var msgs = req.flash();
return Object.keys(msgs).reduce(function(arr, type){
return arr.concat(msgs[type]);
}, []);
}
}
});
app.use(express.logger({ format: ':method :url :status' }));
app.use(express.bodyDecoder());
app.use(express.methodOverride());
app.use(express.cookieDecoder());
app.use(express.session());
app.use(app.router);
app.use(express.staticProvider(__dirname + '/public'));

// Example 500 page
app.error(function(err, req, res){
console.dir(err)
res.render('500');
});

// Example 404 page via simple Connect middleware
app.use(function(req, res){
res.render('404');
});

// Setup ejs views as default, with .html as the extension
app.set('views', __dirname + '/views');
app.register('.html', require('ejs'));
app.set('view engine', 'html');

// Some dynamic view helpers
app.dynamicHelpers({
request: function(req){
return req;
},

hasMessages: function(req){
return Object.keys(req.session.flash || {}).length;
},

messages: function(req){
return function(){
var msgs = req.flash();
return Object.keys(msgs).reduce(function(arr, type){
return arr.concat(msgs[type]);
}, []);
}
}
});
}

// Bootstrap controllers

function bootControllers(app) {
fs.readdir(__dirname + '/controllers', function(err, files){
if (err) throw err;
files.forEach(function(file){
bootController(app, file);
});
fs.readdir(__dirname + '/controllers', function(err, files){
if (err) throw err;
files.forEach(function(file){
bootController(app, file);
});
});
}

// Example (simplistic) controller support

function bootController(app, file) {
var name = file.replace('.js', ''),
actions = require('./controllers/' + name),
plural = name + 's', // realistically we would use an inflection lib
prefix = '/' + plural;

// Special case for "app"
if (name == 'app') {
prefix = '/';
var name = file.replace('.js', '')
, actions = require('./controllers/' + name)
, plural = name + 's' // realistically we would use an inflection lib
, prefix = '/' + plural;

// Special case for "app"
if (name == 'app') prefix = '/';

Object.keys(actions).map(function(action){
var fn = controllerAction(name, plural, action, actions[action]);
switch(action) {
case 'index':
app.get(prefix, fn);
break;
case 'show':
app.get(prefix + '/:id.:format?', fn);
break;
case 'add':
app.get(prefix + '/:id/add', fn);
break;
case 'create':
app.post(prefix + '/:id', fn);
break;
case 'edit':
app.get(prefix + '/:id/edit', fn);
break;
case 'update':
app.put(prefix + '/:id', fn);
break;
case 'destroy':
app.del(prefix + '/:id', fn);
break;
}

Object.keys(actions).map(function(action){
var fn = controllerAction(name, plural, action, actions[action]);
switch(action) {
case 'index':
app.get(prefix, fn);
break;
case 'show':
app.get(prefix + '/:id.:format?', fn);
break;
case 'add':
app.get(prefix + '/:id/add', fn);
break;
case 'create':
app.post(prefix + '/:id', fn);
break;
case 'edit':
app.get(prefix + '/:id/edit', fn);
break;
case 'update':
app.put(prefix + '/:id', fn);
break;
case 'destroy':
app.del(prefix + '/:id', fn);
break;
}
});
});
}

// Proxy res.render() to add some magic

function controllerAction(name, plural, action, fn) {
return function(req, res, next){
var render = res.render,
format = req.params.format,
path = __dirname + '/views/' + name + '/' + action + '.html';
res.render = function(obj, options, fn){
res.render = render;
// Template path
if (typeof obj === 'string') {
return res.render(obj, options, fn);
}

// Format support
if (action == 'show' && format) {
if (format === 'json') {
return res.send(obj);
} else {
throw new Error('unsupported format "' + format + '"');
}
}

// Render template
res.render = render;
options = options || {};
options.locals = options.locals || {};
// Expose obj as the "users" or "user" local
if (action == 'index') {
options.locals[plural] = obj;
} else {
options.locals[name] = obj;
}
return res.render(path, options, fn);
};
fn.apply(this, arguments);
return function(req, res, next){
var render = res.render
, format = req.params.format
, path = __dirname + '/views/' + name + '/' + action + '.html';
res.render = function(obj, options, fn){
res.render = render;
// Template path
if (typeof obj === 'string') {
return res.render(obj, options, fn);
}

// Format support
if (action == 'show' && format) {
if (format === 'json') {
return res.send(obj);
} else {
throw new Error('unsupported format "' + format + '"');
}
}

// Render template
res.render = render;
options = options || {};
// Expose obj as the "users" or "user" local
if (action == 'index') {
options[plural] = obj;
} else {
options[name] = obj;
}
return res.render(path, options, fn);
};
fn.apply(this, arguments);
};
}
7 changes: 7 additions & 0 deletions examples/mvc/views/_messages.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
<% if (hasMessages) { %>
<ul id="messages">
<% messages().forEach(function(msg){ %>
<li><%- msg %></li>
<% }) %>
</ul>
<% } %>
Loading

0 comments on commit 6f2120b

Please sign in to comment.