2016-06-05 4 views
0

Этот вопрос адресован всем, кто имеет как флагов (python), так и знание sailsjs. Я очень новичок в концепции веб-фреймворков и тому подобных. Я начал использовать колбу, но теперь я должен использовать Sailsjs. В колбу, я могу определить маршрут как:Sailsjs route and template rendering

@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' 
} 

, где я должен создать функцию, которая фильтрует базы данных? как я должен быть уверен, что паруса передадут этот параметр org_name в функцию и как передать данные в качестве параметра в шаблон html?

Спасибо тонну.

ответ

1

Здесь есть 2 варианта, но это помогает объяснить немного о каждом, чтобы вы могли выбрать лучший курс действий.

Во-первых, маршруты ... Вы действительно можете, как вы показали визуализировать вид с маршрута напрямую, но вы также можете сделать несколько других вещей. Ниже приведены 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' } },

Отрывок 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}); 
}); 
} 

Во втором отрезал от парусов DOCS Вы можете увидеть «местные» упоминаются. Здесь, на пути GET privacy, мы видим, что в представлении сообщается, следует ли использовать шаблон макета или нет. Однако, с учетом сказанного, нет ничего, что останавливало бы вас толкать больше на местных жителей, таких как имя пользователя и т. Д.

По моему мнению, и что я считаю лучшей практикой, я оставил бы ваши маршруты.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, который является ebook из mannings. Пару дней чтения действительно подтолкнуло меня к скорости!

+0

спасибо. Я смог заставить все работать после прочтения вашего объяснения. – Buckeye14Guy