Изменить роль пользователя в панели администратора - PullRequest
0 голосов
/ 19 февраля 2019

Я создаю панель администратора, где я могу изменять роли пользователя с помощью элемента управления select при использовании alanning:roles.У меня проблема в том, что я не могу получить пользователя, который связан с каждым элементом управления select.Я ссылался на это руководство по созданию админ-панели с помощью Meteor, но когда я вызываю метод changeRoles, консоль возвращает эту ошибку:

Исходная проблема: решена

Error: Missing 'users' param
I20190218-14:59:27.319(-6)?     at Object._updateUserRoles (packages/alanning_roles.js:684:23)
I20190218-14:59:27.319(-6)?     at Object.setUserRoles (packages/alanning_roles.js:250:11)
I20190218-14:59:27.320(-6)?     at MethodInvocation.changeRole (server/main.js:88:13)`

Изменен код с:

Template.userHome.events({
    'click #confirmChanges': function (event) {

        let currentRole = $(event.target).find('option:selected').val();
        let userId = $(event.target.id).val();
        console.log(userId);
        if (window.confirm("Change User Roles?")) {
            Meteor.call("changeRole", {
                role: currentRole,
                user: userId
            })
            window.location.reload();
        }
    }
})

К этому (измените способ установки значения userId):

Template.userHome.events({
    'change [name="userRole"]': function (event) {

    let currentRole = $(event.target).find('option:selected').val();
    let userId = $(event.target.id);
    console.log(currentRole);
    if (window.confirm("Change User Roles?")) {
        Meteor.call("changeRole", {
            role: currentRole,
            user: userId
        })
        window.location.reload();
    }
}

})

Теперь Roles.setUserRoles () не работает, но параметры имеют значения console.log(options.role) возвращает правильное значение и

console.log (options.user) возвращает:

I20190219-20:37:37.527(-6)? { length: 0,
I20190219-20:37:37.528(-6)?   prevObject: 
I20190219-20:37:37.529(-6)?    { length: 0,
I20190219-20:37:37.529(-6)?      prevObject: 
I20190219-20:37:37.529(-6)?       { length: 0,
I20190219-20:37:37.530(-6)?         prevObject: [Object],
I20190219-20:37:37.530(-6)?         context: [Object],
I20190219-20:37:37.531(-6)?         selector: '3FzfDhZWcGFg6ggTE' },
I20190219-20:37:37.531(-6)?      context: { location: [Object] } },
I20190219-20:37:37.532(-6)?   context: 
I20190219-20:37:37.532(-6)?    { location: 
I20190219-20:37:37.532(-6)?       { href: 'http://localhost:3000/userHome',
I20190219-20:37:37.533(-6)?         ancestorOrigins: {},
I20190219-20:37:37.533(-6)?         origin: 'http://localhost:3000',
I20190219-20:37:37.534(-6)?         protocol: 'http:',
I20190219-20:37:37.534(-6)?         host: 'localhost:3000',
I20190219-20:37:37.534(-6)?         hostname: 'localhost',
I20190219-20:37:37.534(-6)?         port: '3000',
I20190219-20:37:37.535(-6)?         pathname: '/userHome',
I20190219-20:37:37.535(-6)?         search: '',
I20190219-20:37:37.536(-6)?         hash: '' } } }

Код клиента:

Template.userHome.events({
    'change [name="userRole"]': function (event) {

        let currentRole = $(event.target).find('option:selected').val();
        let userId = $(event.target.id);
        console.log(currentRole);
        if (window.confirm("Change User Roles?")) {
            Meteor.call("changeRole", {
                role: currentRole,
                user: userId
            })
            window.location.reload();
        }
    }
})

Код сервера:

Meteor.methods({
  changeRole( options ) {
    console.log("Change User is Being Called");
    try {
      Roles.setUserRoles( options.user, [ options.role ] );
      console.log(options.role)
    } catch( exception ) {
      console.log(exception);
    }
  }
});

Шаблон UserHome

<div class="nav">
    <p class="welcomeUser">Welcome, {{#with userInfo}}{{profile.firstname}} {{profile.lastname}}{{/with}}</p>

    <button id="logout" class="universalButton">Log Out</button>


</div>
<div class="pageContent">



    {{#if userIsAdmin}}
    <div class="adminPanel">
        <table id="userTable">
            <caption>Admin Panel</caption>
            <tr>
                <th class="usertableHead">Username</th>
                <th class="usertableHead">Role</th>
            </tr>
            {{#each users}}
            <tr>
                <td class="usertableData">{{username}}</td>
                <td class="usertableData">
                    <div class="styled-select purple rounded">
                        <select id={{_id}} name="userRole">
                            <option value={{roles}}>{{roles}}</option>
                            <option value="Teacher">Teacher</option>
                        </select>
                    </div>
                </td>
            </tr>
            {{/each}}
        </table>
        <button id="confirmChanges" class="universalButton">Confirm Changes</button>
    </div>
    {{/if}}
</div>

1 Ответ

0 голосов
/ 20 февраля 2019

console.log(options.user) должен печатать _id пользователя, а не объект jQuery.В вашем change [name="userRole"] событии замените let userId = $(event.target.id); на let userId = event.target.id;

. Лучший способ присвоения и получения значений приведен ниже:

HTML:

...
  <select data-id={{_id}} name="userRole">
       <option value={{roles}}>{{roles}}</option>
       <option value="Teacher">Teacher</option>
  </select>
...

JS:

Template.userHome.events({
    'change [name="userRole"]': function (event) {
        let userId = event.target.dataset.id;
        let currentRole = event.target.value;
        console.log(userId, currentRole);
        ...
    }
})
...