2012-07-26 8 views
17

मैं पीपोड के नोड.जेएस पूर्ण स्टैक वीडियो पर काम करने की कोशिश कर रहा हूं और ऐसा लगता है कि वे एक्सप्रेस/जेड के पुराने संस्करण का उपयोग कर रहे हैं। लेआउट प्रस्तुत करने के लिए ब्लॉक/विस्तार का उपयोग करने का कोई उल्लेख नहीं है।जेड - विभिन्न निर्देशिकाओं से टेम्पलेट लोड हो रहा है

ऐप में उपयोग किया गया सेटअप एक सब्यू-ऐप के लिए लोड/aviews/layout.jade फ़ाइल होना है। उप-ऐप्स के विचार/ऐप्स // दृश्यों में स्थित हैं।

मेरा server.js बहुत मानक लगता है। एक्सप्रेस संस्करण 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')); 
}); 

उप अनुप्रयोग के लिए मेरे मार्गों फ़ाइल में/apps/प्रमाणीकरण/मार्गों है

routes.coffee

routes = (app) -> 

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

module.exports = routes 

दृश्य मैं के लिए प्रतिपादन पर इरादा इस।

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') 

और अंत में लेआउट।

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

स्थानीय होस्ट करने के लिए जा रहे हैं: 3000/लॉगिन renders इस:

एक्सप्रेस 500 त्रुटि: /Users/StevenNunez/code/HotPie/apps/authentication/views/login.jade:1> 1 | लेआउट 2 बढ़ाता है 3 | ब्लॉक सामग्री 4 | फॉर्म (एक्शन = '/ सत्र', विधि = 'पोस्ट') ENOENT, ऐसी कोई फ़ाइल या निर्देशिका '/Users/StevenNunez/code/HotPie/apps/authentication/views/layout.jade'

मेरा फ़ोल्डर संरचना:

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

आपके समय के लिए धन्यवाद।

उत्तर

15

ऐसा लगता है कि मैं सिर्फ extends कॉल में रिश्तेदार पथ देने के लिए किया था: यदि आप अन्य लेआउट कॉल करने के लिए चाहते हैं, तो आप इस तरह dir उपयोग कर सकते हैं।

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') 

मैं स्थापित करने के लिए app.set('view options',{layout:false});

+0

ठीक है ... यह ठीक काम करता है ... लेकिन ऐप सेट करें क्योंकि विस्तार विधि – andrescabana86

+6

के साथ काम करने का सही तरीका है मैं एक ही ट्यूटोरियल के माध्यम से काम कर रहा हूं और एक ही समस्या। किसी कारण से मैं 'विस्तारित ../../../views/layout' का उपयोग करके सहज नहीं हूं। क्या इसका कोई विकल्प है? – Feech

+0

बहुत बढ़िया। वास्तव में मुझे क्या चाहिए! – Hcabnettek

2

आप प्रतिपादन के दो तरीकों का उपयोग करने की कोशिश कर रहे हैं ... पहला लेआउट जो लेआउट को विस्तारित करता है और दूसरा ब्लॉक सामग्री है। लेआउट का उपयोग करते समय आप login.jade के फ़ोल्डर में स्वचालित रूप से लेआउट फ़ाइल को विस्तारित कर रहे हैं।

extends का उपयोग करना आवश्यक नहीं है और आप block वाक्य का उपयोग नहीं कर सकते हैं, लेकिन यदि आप extends का उपयोग करना चाहते हैं तो आपको लेआउट अक्षम करना होगा।

एप्लिकेशन को यह करें:

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

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

के बाद और फ़ाइलों का विस्तार लेआउट की तरह फैली हुई है:

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') 

लॉगिन फ़ाइल एक ही निर्देशिका में हो गया है।

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

इस के लिए धन्यवाद। "सही" विधि या प्रतिपादन क्या है? चूंकि मैं सिर्फ नोड/एक्सप्रेस/जेड में जा रहा हूं, इसलिए मैं समुदाय द्वारा निर्धारित सम्मेलनों का प्रयास करना और उनका पालन करना चाहता हूं। – StevenNunez

+0

दोनों सही हैं, यह आपके और आपके कौशल पर निर्भर करता है – andrescabana86

5

आप चर __dirname उपयोग कर सकते हैं अन्य निर्देशिकाओं से विचारों कनेक्ट करने के लिए नहीं था।

उदाहरण:

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