29

Okay I have a mostly static homepage but I wanted to have partial views that for navigation, footer ect. I'm using ejs and it looks like this:

my controller: home.js

// Dependencies
var express = require('express');


    module.exports = {
        get: function(req, res) {
            app.set('view engine', 'ejs');  
            var model = {
            layout:'home',
                    };


            res.render('home');


        }
    };

My views directory has nav, home and footer all .ejs

Then the actual html file stripped of text would look as following.

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" >
<title>Tom Jones</title>

<!-- CSS -->
<link rel="stylesheet" href="/css/home.css" type="text/css" media="screen" >

</head>
<body>

<%- partial('nav') %>

<!--content part -->  
<div id="showcontainer">
        <section>

        </section>
</div>

<div id="maincontainer">
        <section>

        </section>
</div>

</body>
</html>

The Problem When ever I test it out I run into the error partial is not defined. I tried requiring ejs but no success.

lostAstronaut
  • 1,452
  • 5
  • 18
  • 33

2 Answers2

60

As @Pickels said, Partial was removed in 3.x. However, the most recent version of EJS provides a mechanism for including "partials", called "include":

https://github.com/visionmedia/ejs#includes

Includes are relative to the template with the include statement, for example if you have "./views/users.ejs" and "./views/user/show.ejs" you would use <% include user/show %>. The included file(s) are literally included into the template, no IO is performed after compilation, thus local variables are available to these included templates.

The following will work as a replacement for your old partial() function. You'll need to make tweaks elsewhere to support Express 3.x completely, but for the most part this seems to work well (better actually - less code and more performant).

<% include nav.ejs %> <!-- replaces your old <%- partial('nav') %> -->

Now in ejs 3.1.x

<% include('relative_filepath'); %>

Must be replaced by

<%- include('relative_filepath'); %>

ht006
  • 77
  • 8
Joshua
  • 3,605
  • 1
  • 25
  • 32
4

Partial was removed in 3.x. It's now up to the templating engine to provide partials.

Pickels
  • 32,420
  • 24
  • 114
  • 175
  • ejs. There is a bridge project for express.js and a lot of templating engines which is called consolidate.js and can be found here: https://github.com/visionmedia/consolidate.js – Pickels Jul 05 '12 at 22:42
  • 6
    Ironically, this is only a 'partial' answer. Can you provide an explanation on how to make Partials work in express 3.x and EJS using consolidate.js? – Joshua Aug 06 '12 at 20:35