2013-12-18 11 views
5

Ho il problema di seguito con Meteor: Ho un amministratore, che deve vedere tutti gli utenti registrati. Ma tutti gli altri utenti non dovrebbero avere la possibilità di vedere gli altri utenti. Perciò ho pubblicato il seguente codice sul lato serverMeteor - Pubblica tutti gli utenti sul client solo per l'amministratore

Meteor.publish("adminUsers", function(){ 

    var result; 
    if (Roles.userIsInRole(this.userId, ["admin"])) 
    { 
     result = Meteor.users.find(); 
    } 
    //console.log(result); 
    return result; 
}); 

Sul lato client mi abbono a questo con

Meteor.subscribe("adminUsers"); 

e fare

AllUsers = new Meteor.Collection("adminUsers"); 

Ora voglio ottenere tutti gli utenti presenti in un modello con questo codice:

Template.adminUserverwaltung.AllUsers = function(){ 
console.log(AllUsers.find()); 
return AllUsers.find(); 
} 

e mostrare il risultato nel modello con questo codice:

<template name="adminUserverwaltung"> 
    {{#each AllUsers}} 
    {{this.username}} 
    {{/each}} 
</template> 

Ma purtroppo non funziona ... Qualcuno mi può aiutare forse?

risposta

4

Quando si iscrive alla raccolta, il nome dell'abbonamento è adminUsers ma la collezione di utenti è ancora Meteor.users che è già definita.

Quindi, solo alterare in modo da utilizzare che invece

Template.adminUserverwaltung.AllUsers = function(){ 
    return Meteor.users.find(); 
} 
1

Ecco cosa si può fare:

if (Meteor.isClient) { 
    Meteor.subscribe("allUsers"); 
    Template.hello.users = function() { 
    return Meteor.users.find(); 
    } 
} 

if (Meteor.isServer) { 
    Meteor.startup(function() { 
    Meteor.publish("allUsers", function(){ 
     var user = Meteor.user(); 
     if (user && user.emails[0].address === '[email protected]'){ 
     return Meteor.users.find(); 
     } 
     return null; 
    }); 
    }); 
} 

In questo modo solo utente [email protected]lhost vedranno tutti gli utenti. Gli altri vedranno solo se stessi.

C'è un esempio di pubblicazione raccolta utenti personalizzati nel meteor docs.

+0

Questo sembra essere scoraggiato da [meteor.com: Meteor.user()] (http://docs.meteor.com/#/full/meteor_user) che documenta di non usare 'Meteor.user()' all'interno di 'Meteor.publish()' – Paul

+0

Potrebbe essere cambiato dal 2013. ['publish'] (http://docs.meteor.com/#/full/meteor_publish) la documentazione suggerisce di usare' this.userId'. – rzymek

+0

Sì, ho scoperto che avevo bisogno di raccogliere '_id' per gli amministratori e popolare un array globale sul lato server per il confronto con' this.userId'. Cercare di sondare le proprietà dei record utente non funzionava per me all'interno della pubblicazione. – Paul

0

Sei quasi arrivato ... Questa risposta utilizza il pacchetto dei ruoli meteor come l'OP posto nella domanda.

Meteor.publish("adminUsers", function(){ 
    var result = []; 
    if (Roles.userIsInRole(this.userId, ["admin"])) { 
     result = Meteor.users.find(); 
    } else { 
     this.stop(); 
     // YOUUU SHALL NOT.... PASS!!! ~Gandalf 
    } 
    return result; 
}); 

Sul lato client, iscrivere a questo con:

Meteor.subscribe("adminUsers"); 

non fare questo. Omettalo. Meteor.users è la tua collezione.

// NOO!! AllUsers = new Meteor.Collection("adminUsers"); 

Ora voglio ottenere tutti gli utenti in un modello con questo codice:

Template.adminUserverwaltung.helpers = { 
    AllUsers: function(){ 
     return Meteor.users.find(); 
    } 
}; 

e mostrare il risultato nel modello con questo codice:

<template name="adminUserverwaltung"> 
{{#each AllUsers}} 
    {{this.username}} 
{{/each}} 
</template> 

e dovrebbe ora sta lavorando. :)

Problemi correlati