SailsJS错误:编辑视图未定义技能

时间:2014-04-08 11:20:15

标签: rest crud sails.js ejs

我正在构建一个应用程序,人们可以将技能放入其中。我使用此代码创建了一个编辑控制器:

  /**
   * Action blueprints:
   *    `/skill/edit`
   */
  edit: function(req, res, next) {
    Skill.findOne(req.param('id'), function foundSkill(err, skill) {
      // if skill is not find output an error
      if (err) return next(err);

      // if the skill is find
      if(!skill) return next();

      // Show skill
      res.view({
        skill:skill
      });
    });

    // Get an array of all categorys in the Category collecction
    Category.find(function foundCategorys(err, categorys) {
      // if category is not find output an error
      if (err) return next(err);

      // pass the array down to the /view/index.ejs page
      res.view({
        categorys:categorys
      });
    });

  },

用户必须根据每项技能选择一个类别。所以我认为这是实现这一目标的方法。

这是edit.ejs视图文件中的代码:

<div class="wrapper" id="skill_page">

    <div class="col-md-12">
        <article>
            <form action="/skill/update/<%= skill.id %>" method="POST" class="form-signin" id="edit-skill-form">
                <h2 class="form-sigin-heading">Edit an skill</h2>
                <div class="input-form">
                    <input type="text" class="form-control" placeholder="Skill title" name="title" value="<%= skill.title %>">
                </div>
                <div class="input-form">
                    <select name="skillCat">
                        <option>Choose category</option>
                        <% for(category in categories) { %>
                        <option value="<%= category.id %>"><%= category.title %></option>
                        <% } %>
                    </select>
                </div>
                <div class="input-form">
                    <label for="ratingType">Rating on or of</label>
                    <select name="ratingType" id="ratingType">
                        <option>Choose rating type</option>
                        <option>No-rating</option>
                        <option value="true">Rating</option>
                    </select>
                </div>
                <input type="submit" class="btn btn-lg btn-primary btn-block" value="Save changes">
                <input type="hidden" name="_csrf" value="<%= _csrf %>">
            </form>
        </article>
    </div>  
</div>

当我在控制台中使用sails lift解除应用程序,然后转到特定技能的技能编辑页面时会出现如下错误:

error: Error rendering view at :: /vagrant/Skillsmatrix/views/skill/edit
error: Using layout located at :: /vagrant/Skillsmatrix/views/layout
error: Server Error (500)
error: ReferenceError: /vagrant/Skillsmatrix/views/skill/edit.ejs:5
    3|  <div class="col-md-12">
    4|          <article>
 >> 5|                  <form action="/skill/update/<%=
skill.id %>" method="POST" class="form-signin" id="edit-skill-form">
    6|                          <h2 class="form-sigin-heading">Edit an skill</h2>
    7|                          <div class="input-form">
    8|                                  <input type="text" class="form-control" placeholder="Skill title" name="title" value="<%= skill.title %>">

skill is not defined

但我不知道如何解决问题或我做错了什么。特别是为什么错误skill is not defined会出现。如果有人给我帮助和/或反馈,我真的很满!

2 个答案:

答案 0 :(得分:0)

有几件事:

首先,AFAIK,动作函数中没有回调,因此签名应该更像edit: function(req, res) {...

第二:您正在异步运行两个查询(针对技能和类别),因此渲染器永远不会同时获取这两个值。如果您在视图中需要技能和类别,则必须嵌套调用。类似的东西:

/**
   * Action blueprints:
   *    `/skill/edit`
   */
  edit: function(req, res, next) {
    Skill.findOne(req.param('id'), function foundSkill(err, skill) {
      // if skill is not find output an error
      if (err) return res.serverError(err);

      // if the skill is find
      if(!skill) return res.notFound();

      // Get an array of all categories in the Category collection
      Category.find(function foundCategories(err, categories) {
        // if category is not find output an error
        if (err) return res.serverError(err);

        return res.view({
          skill: skill,
          categories: categories
        });
      });
    });    
  },

与此同时,您在视图中看起来并没有使用类别。所以,如果它只是一些遗留代码,只需将其删除(因为它会导致您的问题):

/**
   * Action blueprints:
   *    `/skill/edit`
   */
  edit: function(req, res, next) {
    Skill.findOne(req.param('id'), function foundSkill(err, skill) {
      // if skill is not find output an error
      if (err) return res.serverError(err);

      // if the skill is find
      if(!skill) return res.notFound();

      return res.view({
        skill: skill
      });
    });    
  },

答案 1 :(得分:0)

我附近有人帮助我找出解决方案。我的问题是我想要同时获得2个对象。使用代码,我没有工作。

所以这是解决方案的工作方式:

  /**
   * Action blueprints:
   *    `/skill/edit`
   */
  edit: function(req, res, next) {

    Skill.findOne(req.param('id'), function foundSkill(result, skill) {
      Category.find(function foundCategorys(err, categories) {
        res.view({
          skill:skill,
          categories: categories
        });
      });
    });
  },

如果某人有更好或更有效的方式,我想知道!