【问题标题】:SailsJS error: skill is not defined by edit viewSailsJS 错误:编辑视图未定义技能
【发布时间】:2014-04-08 11:20:15
【问题描述】:

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

  /**
   * 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。如果有人给我帮助和/或反馈,我真的很棒!

【问题讨论】:

    标签: rest crud sails.js ejs


    【解决方案1】:

    有几点:

    首先,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
          });
        });    
      },
    

    【讨论】:

    • 感谢@bredikhin 的评论!我附近的人帮了我!我将在下面发布答案,以便其他人可以使用它:-)
    【解决方案2】:

    我附近的人帮助我找出解决方案。我的问题是我想同时获得 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
            });
          });
        });
      },
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-27
      • 2016-09-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-31
      • 1970-01-01
      相关资源
      最近更新 更多