Sailsjs路线和模板渲染

时间:2016-06-05 18:35:05

标签: python sails.js flask-sqlalchemy web-frameworks

这个问题针对任何具有烧瓶(python)和sailsjs知识的人。我对Web框架等概念很陌生。我开始使用烧瓶,但现在我必须使用Sailsjs。在烧瓶中,我可以将路线定义为:

@app.route('/company/<org_name>')
def myfunction(org_name):
    ...use org_name to filter my database and get data for that company...
    return render_template('companies.html', org_name=org_name, mydata=mydata)

我可以使用 myfunction()来渲染我可以传递参数 org_name mydata 的模板。

在帆中,我对如何使用给定参数定义路线感到困惑。我明白了:

'/': {
view: 'companies'
}

但我不知道如何使路线动态化以接受任何变量 org_name

另一个问题是在python中, mydata 是来自MySQL数据库的查询。我有完全相同的数据库连接到Sailsjs,但我确信这个模型没用。我正在创建的网站不会生成任何新数据(即我既不会更新也不会将新数据保存到数据库中。)

因此我的问题是:

'/company/:org_name': {
view: 'companies'
}

我应该在哪里创建过滤数据库的函数?我应该如何确定sails会将org_name参数传递给函数,以及如何将数据作为参数传递给html模板?

非常感谢。

1 个答案:

答案 0 :(得分:1)

这里有2个选项,但它有助于解释每个选项,以便您选择最佳的行动方案。

首先,路线......您确实可以直接从路线渲染视图,但您也可以做其他一些事情。以下是来自sails.js网站文档的两个片段:

  1. module.exports.routes = { 'get /signup': { view: 'conversion/signup' }, 'post /signup': 'AuthController.processSignup', 'get /login': { view: 'portal/login' }, 'post /login': 'AuthController.processLogin', '/logout': 'AuthController.logout', 'get /me': 'UserController.profile' }

  2. 'get /privacy': { view: 'users/privacy', locals: { layout: 'users' } },

  3. 代码段1显示了如何直接呈现视图,以及如何指向控制器以执行更复杂的逻辑。

    您的控制器中的登录可能意味着对于/me "GET"路由,您可以在“profile”方法中执行数据库查询以接受get参数,查找用户,然后在其中显示包含用户数据的视图。一个例子是:

    Profile: function (req,res){
    User.find({name: req.param('name')}.exec(function founduser(err,result){
      return view('profile',{userdata: result});
    });
    }
    

    在从帆文档中剪切的第二部分中,您可以看到提到的“本地人”。在GET隐私路线中,我们看到视图被告知是否使用布局模板。然而,话虽如此,没有什么可以阻止你更多地进入当地人,如用户名等。

    在我看来,我觉得这是最好的做法,我会让你的routes.js变得非常薄和无逻辑,将数据库查询/逻辑/重定向放入你的控制器。

    对于您的具体示例:

    我的routes.js文件可能看起来像这样

    // config/routes.js
    module.exports.routes = {
      'get /companies': 'CompanyController.index',
      'get /companies/:orgname': 'CompanyController.company'
    }
    

    这允许第一条路线可能通过转到/companies来显示公司列表,并且当基于点击公司名称作出取得请求时,我的第二条路线可能会触发。 /companies/Siemens

    我的CompanyController.js可能如下所示:

        module.exports = {
      index: function (req, res) {
        return res.view('companieslist');
      },
      company: function (req, res) {
        var companyName = req.param('orgname'); //Get the company name supplied
    
        //My company model which could be in api/models as Company.js is used to find the company
        Company.find({name: companyName}).limit(1).exec(function companyresult(err,result){
     //Error catch
     if(err){return res.negotiate(err)};
     //The result of our query is pushed into the view as a local
     return res.view('company',{companydata: result}); //Within the .find callback to ensure we keep async
     });
    
      }
    };
    

    在我看来,我可以访问在“companydata”下检索到的数据,例如对于EJS:

    <%=companydata[0].name%>
    

    如果您需要任何进一步的帮助/澄清,请告知我们。我建议你看一下sails.js文档,但是如果你真的想了解一下我推荐的sails.js在Action中这是一个来自mannings的电子书。几天的阅读真的让我加快了速度!