Пользовательский маршрут Sails.js с тем же контроллером, но разными макетами

Сегодня я здесь, чтобы не просто проверить хорошие ответы, но и спросить! Я хочу сделать следующее, используя Sails.js и его route.js:

Моя проблема

Я хочу на самом деле предоставить разные макеты в зависимости от типа пользователя, вошедшего в систему. Я знаю, как это сделать, но я не хочу писать это в файле routes.js (потому что это беспорядочно, и я не хочу создавать контроллеры чтобы выполнить работу самого маршрута):

'get /adminSpace/*' : {
    controller : 'adminSpace' //setting layout on controller
},
'get /userSpace/*' : {
    controller : 'userSpace' // //setting layout on controller
}

Быстрый способ, если это возможно, состоял бы в том, чтобы написать это так:

'get /[user|admin]/projects/*' : {
    controller : 'project'
    locals: {
      layout: 'based_on_url'
}}

Это как-то возможно?


person paulogdm    schedule 29.09.2017    source источник
comment
Просто для ясности: я не хочу добавлять посредников AdminSpaceController и UserSpaceController для настройки макета! А затем специализация каждого URL-адреса контроллера для каждой роли. Какие-нибудь советы?   -  person paulogdm    schedule 29.09.2017
comment
Маршруты Sails могут делать довольно сложные вещи: sailsjs.com/documentation/concepts/routes/custom -routes но мои инстинкты говорят мне, почему бы не использовать свой контроллер? Я не уверен, что локальные пользователи, установленные в файле маршрутов, могут получить доступ к подстановочным знакам (например, [пользователь | администратор] и т. д.), взятым из самого маршрута, или другим динамическим данным.   -  person arbuthnott    schedule 30.09.2017
comment
Я также чувствую, что два маршрута могут быть проще! Другие разработчики, просматривающие ваш код, безусловно, могли бы понять два маршрута быстрее, чем разбирать забавный синтаксис, используемый для помещения регулярных выражений в маршруты.   -  person arbuthnott    schedule 30.09.2017
comment
Ну а общая идея у меня такая: решить тип пользователя -> использовать соответствующий контроллер по модели. Если я не могу этого сделать, мне нужно повторить кусок кода, например if(requester == admin) { (set layout here)} else {}, для каждого действия контроллера. Видите мою точку зрения? То, что я хочу, это обычное место, чтобы поместить это, а затем использовать мои контроллеры без знания макета.   -  person paulogdm    schedule 01.10.2017


Ответы (1)


Хорошо, я думаю, что я читаю то, что вы хотите, основываясь на комментариях - вы хотите разное поведение для обычных пользователей и пользователей с правами администратора. У вас будет код для обработки этого в файле routes.js и в файле views, но вы хотите, чтобы контроллеры игнорировали разницу — они могут делать свое дело, не утруждая себя определением «админ против обычного».

Вы можете сделать это, установив locals на двух разных маршрутах, указывающих на один и тот же контроллер:

'GET /adminSpace/*' : {
    controller : 'UserController',
    locals: {
        admin: true,
        _layoutFile: 'admin'
    }
},
'GET /userSpace/*' : {
    controller : 'UserController', // same as above
    locals: {
        admin: false,
        _layoutFile: 'user'
    }
},

Затем в вашем UserController:

someAction: function(req, res) {
    // any logic needed
    // can access sails.locals.admin if necessary, but do not have to
    return res.view(); // will use admin.ejs or users.ejs as set in route
}

С вашей точки зрения, локальные переменные, установленные в маршруте, по-прежнему будут доступны, и при необходимости вы можете добавить дополнительные локальные переменные в контроллере. Надеюсь, это было то, что вы искали!

person arbuthnott    schedule 01.10.2017