从视图中的对象获取slug将无法正常工作

时间:2016-06-26 21:04:46

标签: mongodb handlebars.js keystonejs

我创建了一个名为Project的新对象,其中包含一个库和其他一些字段。在视图中,我正在显示一些数据,我想要链接到上一个和下一个项目。我已经设法得到了以前的项目,但当我试图从中获取slug时,不知何故它不起作用。

这是项目模型:

var keystone = require('keystone');
var Types = keystone.Field.Types;

/**
 * Project Model
 * ==========
 */

var Project = new keystone.List('Project', {
    map: { name: 'title' },
    autokey: { path: 'slug', from: 'title', unique: true }
});

Project.add({
    title: { type: String, required: true },
    state: { type: Types.Select, options: 'draft, published, archived', default: 'draft', index: true },
    author: { type: Types.Relationship, ref: 'User', index: true },
    publishedDate: { type: Types.Date, index: true, dependsOn: { state: 'published' } },
    category: { type: String, required: false },
    description: { type: Types.Html, wysiwyg: true, height: 150 },
    shortDescription: { type: Types.Html, wysiwyg: true, height: 100 },
    credits: { type: Types.Html, wysiwyg: true, height: 100 },
    galleries: { type: Types.Relationship, ref: 'Gallery', many: false },
    color: { type: String, required: false }
});

Project.schema.virtual('content.full').get(function() {
    return this.content.extended || this.content.brief;
});

Project.defaultColumns = 'title, state|20%, author|20%, publishedDate|20%';
Project.register();

这是控制器:

var keystone = require('keystone');

exports = module.exports = function(req, res) {

    var view = new keystone.View(req, res);
    var locals = res.locals;

    // Set locals
    locals.section = 'projects';
    locals.filters = {
        project: req.params.project
    };
    locals.data = {
        projects: [],
        previousProject: []
    };

    // Load the current project
    view.on('init', function(next) {

        var q = keystone.list('Project').model.findOne({
            state: 'published',
            slug: locals.filters.project
        }).populate('galleries');

        q.exec(function(err, result) {
            locals.data.project = result;
            next(err);
        });

    });

    //Load other projects
    view.on('init', function(next) {

        var q = keystone.list('Project').model.find({state: "published", publishedDate: {$lt: locals.data.project.publishedDate}}).sort('-publishedDate').limit(1);
        q.exec(function(err, results) {
            locals.data.previousProject = results;
            next(err);
        });

    });

    // Render the view
    view.render('project');

};

这就是观点:

<div class="container">
    <p>{{{data.project.title}}}</p>
    <p>—</p>
    <p>{{{data.project.category}}}</p>

    {{#if data.project.galleries}}
        {{#each data.project.galleries.images}}
            <img src="{{url}}" />
        {{/each}}
    {{/if}}
    <p>full project: {{data.previousProject}}</p>
    <p>slug: {{data.previousProject.slug}}</p>
    {{#if data.previousProject}}
        <a href="/projects/{{data.previousProject.slug}}" >Previous project</a>
    {{/if}}
</div>

不知何故,{{data.previousProject}}显示正确的记录信息,但当我{{data.previousProject.slug}}时,它根本不返回任何内容。几个小时我一直在摸不着头脑,但我找不到问题所在。在此先感谢!!

1 个答案:

答案 0 :(得分:0)

我终于找到了问题所在:在控制器中我使用model.find而我应该使用model.findOne如果我知道我只需要一条记录而我想直接获取来自.slug的值。使用limit(1)还不够。