2012-07-26 20 views
17

Ich versuche, Peepcode Node.js Full Stack Videos zu arbeiten und es scheint, dass sie eine ältere Version von Express/Jade verwenden. Keine Erwähnung der Verwendung von block/extends zum Rendern von Layouts.Jade - Loading Vorlagen aus verschiedenen Verzeichnissen

Das in der App verwendete Setup enthält eine Datei /views/layout.jade, die für alle Unteranwendungen geladen wird. Die Ansichten der Unteranwendungen befinden sich in den Ansichten von/apps //.

Mein server.js scheint ziemlich Standard. Express ist die Version 3.0.0rc1

require('coffee-script'); 

var express = require('express') 
    , http = require('http') 
    , path = require('path'); 

var app = express(); 

app.configure(function(){ 
    app.set('port', process.env.PORT || 3000); 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'jade'); 
    app.use(express.favicon()); 
    app.use(express.logger('dev')); 
    app.use(express.bodyParser()); 
    app.use(express.methodOverride()); 
    app.use(app.router); 
    app.use(express.static(path.join(__dirname, 'public'))); 
}); 

app.configure('development', function(){ 
    app.use(express.errorHandler()); 
}); 

require('./apps/authentication/routes')(app) 

http.createServer(app).listen(app.get('port'), function(){ 
    console.log("Express server listening on port " + app.get('port')); 
}); 

Meine Routen-Datei für die Sub-App in ist/apps/Authentifizierung/Routen

routes.coffee

routes = (app) -> 

    app.get "/login", (req,res) -> 
    res.render "#{__dirname}/views/login", 
     title: "Login" 
     stylesheet: 'login' 

module.exports = routes 

Die Ansicht, die ich auf Rendering beabsichtigen Dies.

login.jade

extends layout 

block content 
    form(action='/sessions', method='post') 
    label 
     | Username 
     input(type='text', name='user') 
    label 
     | Password 
     input(type='password', name='password) 
    input(type='submit', name='Submit') 

und schließlich das Layout.

doctype 5 
html 
    head 
    title= title 
    link(rel='stylesheet', href='/stylesheets/#{stylesheet}.css') 
    body 
    block content 

Going to localhost: 3000/login macht diese:

Express 500 Fehler: /Users/StevenNunez/code/HotPie/apps/authentication/views/login.jade:1> 1 | erweitert Layout 2 | 3 | Inhalt blockieren 4 | form (action = '/ sessions', method = 'post') ENOENT, keine solche Datei oder kein Verzeichnis '/Users/StevenNunez/code/HotPie/apps/authentication/views/layout.jade'

Meine Ordnerstruktur:

. 
├── ' 
├── apps 
│   └── authentication 
│    ├── routes.coffee 
│    └── views 
│     └── login.jade 
├── package.json 
├── public 
├── server.js 
└── views 
    ├── index.jade 
    └── layout.jade 

Vielen Dank für Ihre Zeit.

Antwort

15

Es sieht aus wie ich musste nur den relativen Pfad geben im extends Anruf.

extends ../../../views/layout 

block content 
    form(action='/sessions', method='post') 
    label 
     | Username 
     input(type='text', name='user') 
    label 
     | Password 
     input(type='password', name='password') 
    input(type='submit', name='Submit') 

Ich habe nicht app.set('view options',{layout:false});

+0

ok ... es funktioniert gut ... aber die App einstellen, weil der richtige Weg ist, mit der extends-Methode – andrescabana86

+6

zu arbeiten Ich arbeite durch das gleiche Tutorial und kam über Dasselbe Problem. Aus irgendeinem Grund fühle ich mich nicht wohl dabei, 'extends ../../../views/layout' zu verwenden. Gibt es eine Alternative dazu? – Feech

+0

Ehrfürchtig. Genau das, was ich brauchte! – Hcabnettek

2

Sie versuchen, zwei Methoden zum Rendern zu verwenden ... Das erste Layout, das das Layout erweitert und das zweite ist Blockinhalt. Bei Verwendung eines Layouts erweitern Sie automatisch die Layoutdatei im Ordner login.jade.

Es ist nicht notwendig, extends zu verwenden, und Sie können nicht block Satz verwenden, aber wenn Sie extends verwenden möchten, müssen Sie Layout deaktivieren.

Fügen Sie diese auf der App:

app.set('view options',{layout:false}); 

nach

app.set('view engine', 'jade'); 

und erweitern Sie die Dateien wie Layout erweitert:

layout.jade

doctype 5 
html 
    head 
    title= title 
    link(rel='stylesheet', href='/stylesheets/#{stylesheet}.css') 
    body 
    block content 

login.jade

extends layout 

block content 
    form(action='/sessions', method='post') 
    label 
     | Username 
     input(type='text', name='user') 
    label 
     | Password 
     input(type='password', name='password) 
    input(type='submit', name='Submit') 

Die Login-Datei im selben Verzeichnis sein muss.Wenn Sie andere Layout aufrufen möchten, können Sie das Verzeichnis wie folgt verwenden:

appDirectory 
    views 
    layout 
    otherViews 
    login 

login.jade

extends ../views/layout  
block content 
    form(action='/sessions', method='post') 
    label 
     | Username 
     input(type='text', name='user') 
    label 
     | Password 
     input(type='password', name='password) 
    input(type='submit', name='Submit') 
+0

Dank dafür. Was ist die "richtige" Methode oder das Rendering? Da ich gerade in Node/Express/Jade einsteigen möchte, möchte ich versuchen, den Konventionen der Community zu folgen. – StevenNunez

+0

beide sind richtig, es hängt von Ihnen und Ihren Fähigkeiten – andrescabana86

5

setzen Sie Variable __dirname Ansichten aus anderen Verzeichnissen verbinden können.

Beispiel:

app.get('/otherurl/' , function(req, res){ 
    res.render(__dirname + '/../other_project/views/index') 
}); 
Verwandte Themen