Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ejs 'partial is not defined'

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.

like image 232
lostAstronaut Avatar asked Jul 05 '12 19:07

lostAstronaut


People also ask

How do you set partials in EJS?

Use <% - include( 'RELATIVE/PATH/TO/FILE' ) %> to embed an EJS partial in another file. The hyphen <%- instead of just <% to tell EJS to render raw HTML. The path to the partial is relative to the current file.

What are partials in Express?

Partials are basically just views that are designed to be used from within other views. They are particularly useful for reusing the same markup between different views, layouts, and even other partials. <%- partial('./partials/navbar.ejs') %>


1 Answers

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') %> --> 
like image 61
Joshua Avatar answered Sep 24 '22 17:09

Joshua