Estoy tratando de trabajar en la Peepcode del Node.js Pila Completa de vídeos y parece que estás usando una versión anterior de express/jade. No hay mención del uso de bloque/se extiende a renderizar diseños.

El programa de instalación se utiliza en la aplicación es tener un /views/diseño.jade archivo que se cargará para todos los sub-apps. La sub-aplicaciones de puntos de vista se encuentran en /aplicaciones//puntos de vista.

Mi server.js parece bastante estándar. Express es la versión 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'));
});

Mi archivo de rutas para la sub-aplicación está en /apps/autenticación/rutas

rutas.café

routes = (app) ->

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

module.exports = routes

El punto de vista que la intención de la representación de este.

de inicio de sesión.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')

Y Finalmente el diseño.

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

Va a localhost:3000/login hace esto:

Express
Error 500: /Users/StevenNunez/código/HotPie/apps/autenticación/views/inicio de sesión.jade:1 > 1| se extiende layout 2| 3| bloque de contenido 4| forma(acción=’/sesiones’, method=’post’) ENOENT, no existe el fichero o el directorio ‘/Usuarios/StevenNunez/código/HotPie/apps/autenticación/views/diseño.jade’

Mi estructura de carpetas:

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

Gracias por su tiempo.

InformationsquelleAutor StevenNunez | 2012-07-26

3 Comentarios

  1. 16

    Parece que he tenido que dar la ruta relativa en el extends llamada.

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

    No tuve que configurar app.set('view options',{layout:false});

    • ok… funciona bien… pero de conjunto de la aplicación, porque es la manera correcta de trabajar con el método se extiende
    • Estoy trabajando a través de la misma tutorial y se encontró con el mismo problema. Por alguna razón no me siento cómodo usando ‘se extiende ../../../views/layout’. Hay una alternativa a esto?
    • Impresionante. Exactamente lo que necesitaba!
    • Para evitar ../../../views/layout puede establecer de jade basedir de configuración variable: app.locals.basedir = __dirname + '/views'; y después de que usted debe utilizar ‘absoluto’ (absoluta de basedir) rutas de acceso en sus puntos de vista, por ejemplo: extends /layout
    • Gracias tenía un problema. esta solución se corrigió.
    • Todavía no estoy capaz de pasar a los locales en el bloque de usar esta solución.

  2. 5

    Puede utilizar la variable de __dirname para conectar los puntos de vista de otros directorios.

    Ejemplo:

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

    Usted está tratando de utilizar dos métodos de representación…
    El primer diseño que se extiende el diseño y el segundo es el contenido del bloque.
    Cuando se utiliza un diseño que se extiende automáticamente el archivo de diseño en la carpeta de login.jade.

    No es necesario el uso de extends y usted no puede usar block frase, pero si usted desea utilizar extends tienes que desactivar el layout.

    Agregar esto a la aplicación:

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

    después de

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

    y extender los archivos como el diseño se extiende:

    diseño.jade

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

    de inicio de sesión.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')

    El inicio de sesión en el archivo tiene que estar en la misma dir. Si desea llamar a otro diseño puede utilizar el informe como este:

    appDirectory
      views
        layout
      otherViews
        login

    de inicio de sesión.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')
    • Gracias por este. ¿Qué es el «derecho» o el método de la representación? Ya que estoy empezando en el nodo/express/jade quiero probar y seguir las convenciones establecidas por la comunidad.
    • ambos tienen razón, depende de ti y de tus habilidades

Dejar respuesta

Please enter your comment!
Please enter your name here