2015-10-08 19 views
7

Nie mam pojęcia, co się dzieje w mojej aplikacji. Próbuję zaktualizować profil użytkownika. Jeśli użytkownik ma już profil, powinien wyświetlić bieżące wartości profilu. Mam SimpleSchema dołączony do kolekcji użytkownika.Profil użytkownika aktualizacji Meteor

<template name="updateCustomerProfile"> 
    <div class="container"> 
    <h1>Edit User</h1> 
    {{#if isReady 'updateCustomerProfile'}} 
     {{#autoForm collection="Users" doc=getUsers id="profileForm" type="update"}} 
     <fieldset> 
      {{> afQuickField name='username'}} 
      {{> afObjectField name='profile'}} 
     </fieldset> 
     <button type="submit" class="btn btn-primary">Update User</button> 
     <a class="btn btn-link" role="button" href="{{pathFor 'adminDocuments'}}">Back</a> 
     {{/autoForm}} 
    {{else}} 
     Nothing 
    {{/if}} 
    </div> 
</template> 

mam pomocnika Szablon:

Template.updateCustomerProfile.events({ 
getUsers: function() { 
    //return Users.findOne(); 
    return Meteor.user(); 
    } 
}); 

mam hak AUTOFORM

AutoForm.addHooks(['profileForm'], { 
    before: { 
     insert: function(error, result) { 
     if (error) { 
      console.log("Insert Error:", error); 
      AutoForm.debug(); 
     } else { 
      console.log("Insert Result:", result); 
      AutoForm.debug(); 
     } 
     }, 
     update: function(error) { 
     if (error) { 
      console.log("Update Error:", error); 
      AutoForm.debug(); 
     } else { 
      console.log("Updated!"); 
      console.log('AutoForm.debug()'); 
     } 
     } 
    } 
    }); 

mieć następującą trasę:

customerRoutes.route('/profile/edit', { 
    name: "updateCustomerProfile", 
    subscriptions: function (params, queryParams) { 
    this.register('updateCustomerProfile', Meteor.subscribe('usersAllforCustomer', Meteor.userId())); 
    }, 
    action: function(params, queryParams) { 
    BlazeLayout.render('layout_frontend', { 
     top: 'menu', 
     main: 'updateCustomerProfile', 
     footer: 'footer' 
    }); 
    } 
}); 

i wreszcie następujące publikacje:

Meteor.publish('usersAllforCustomer', function (userId) { 
    check(userId, String); 
    var user = Users.findOne({_id: userId}); 
    if (Roles.userIsInRole(this.userId, 'customer')) { 
     return Users.find({_id: userId}); 
    } 
}); 

A oto kolekcja:

Users = Meteor.users; 

Schema = {}; 

Schema.UserProfile = new SimpleSchema({ 
    firstName: { 
     type: String, 
     optional: true 
    }, 
    lastName: { 
     type: String, 
     optional: true 
    }, 
    gender: { 
     type: String, 
     allowedValues: ['Male', 'Female'], 
     optional: true 
    }, 
    organization : { 
     type: String, 
     optional: true 
    } 
}); 

Schema.User = new SimpleSchema({ 
    username: { 
     type: String, 
     optional: true 
    }, 
    emails: { 
     type: Array, 
     optional: true 
    }, 
    "emails.$": { 
     type: Object 
    }, 
    "emails.$.address": { 
     type: String, 
     regEx: SimpleSchema.RegEx.Email 
    }, 
    "emails.$.verified": { 
     type: Boolean 
    }, 
    createdAt: { 
     type: Date, 
     optional: true, 
     denyUpdate: true, 
     autoValue: function() { 
      if (this.isInsert) { 
       return new Date(); 
      } 
     } 
    }, 
    profile: { 
     type: Schema.UserProfile, 
     optional: true 
    }, 
    services: { 
     type: Object, 
     optional: true, 
     blackbox: true 
    }, 
    roles: { 
     type: [String], 
     optional: true 
    } 
}); 

Meteor.users.attachSchema(Schema.User); 

Jestem pewien obiekt użytkownika jest przekazywana w publikacji. Nie mogę zaktualizować profil: Otrzymuję następujący błąd (od AUTOFORM debugowania):

Update Error: Object {$set: Object} 
    $set: Object 
     profile.firstName: "test_firstname" 
     profile.gender: "Female" 
     profile.lastName: "test_lastname" 
     profile.organization: "test_organisation 
     "username: "test_username" 

Jak przejść o aktualizowanie profilu, patrząc ślepy ....

+0

Czy możesz umieścić odpowiednią część swojego schematu? – challett

+0

Pewnie. Zmieniłem oryginalne pytanie, aby je uwzględnić. – wiwa1978

+0

Czy używasz niezabezpieczonego pakietu? Jeśli nie, upewnij się, że skonfigurowałeś uprawnienia do kolekcjonowania, aby profile użytkowników mogły być aktualizowane przez autoryzowanych użytkowników. –

Odpowiedz

0

Meteorpad rzeczywiście rozwiązał problem. W pomocniku był błąd. W rzeczywistości, oryginalny kod był:

Template.updateCustomerProfile.events({ 
getUsers: function() { 
    return Meteor.user(); 
    } 
}); 

Tak więc w powyższym fragmencie byłem przy użyciu „zdarzeń” zamiast „pomocnika”. Poniżej znajduje się poprawny kod:

Template.updateCustomerProfile.helpers({ 
    getUsers: function(){ 
    return Meteor.user(); 
    } 
}); 
3

trzeba zmienić swój before AutoForm Hooks.

AutoForm.addHooks(['profileForm'], { 
    before: { 
    insert: function(doc) { 
     console.log('doc: ', doc); 
     return doc; 
    }, 

    update: function(doc) { 
     console.log('doc: ', doc); 
     return doc; 
    }, 
    }, 
}); 

Choć after zwrotna ma js standardowy podpis (error, result) funkcyjnego before zwrotna ma tylko jeden parametr, DOC do wstawienia/aktualizacji. Dlatego zawsze rejestrujesz "błąd", to tylko dokument, który chcesz wstawić. Musisz go albo zwrócić, albo przekazać do this.result, aby faktycznie wstawić/zaktualizować obiekt w db.

From the docs:

var hooksObject = { 
    before: { 
    // Replace `formType` with the form `type` attribute to which this hook applies 
    formType: function(doc) { 
     // Potentially alter the doc 
     doc.foo = 'bar'; 

     // Then return it or pass it to this.result() 
     return doc; (synchronous) 
     //return false; (synchronous, cancel) 
     //this.result(doc); (asynchronous) 
     //this.result(false); (asynchronous, cancel) 
    } 
    }, 
+0

Naprawdę powinienem to zobaczyć. Dzięki za wskazanie! Jednak nawet po zmianie na sugestię to nie działa. Mogę wstawiać nowych użytkowników do Mongo, ale nie mogę aktualizować istniejących użytkowników. W Autohooku mam plik console.log, który wyprowadza dokument. Nie widzę błędów, ale wydaje mi się, że baza danych Mongo nie jest aktualizowana. Jakieś pomysły? – wiwa1978

+0

Niezupełnie. Najlepszą rzeczą, jaką możesz zrobić, jest stworzenie [mcve], ponieważ to pytanie jest dalekie od tego. W ten sposób powstanie pytanie, na które będzie mogła pomóc większa liczba osób, jego wartość jest również w toku, ponieważ poprzez pozbycie się go można znaleźć rozwiązanie samodzielnie. Stwórz przykład, który nie korzysta z haków automatycznych, nie wymaga przepływu: routera, alanningu: ról, itp. Było dużo do potknięcia się, aby znaleźć powyższy problem, a coś, co wyłudziłem, może być maskowane inny problem. W każdym razie postaram się uzyskać to, co mam w meteorpad i zamieścić link. – JeremyK

+1

Widziałem jeden inny błąd z przepływu: router nie lubi Meteor.userId() w bloku subskrypcji trasy, ponieważ router nie jest reaktywny. Uważam jednak, że jest to dość nieszkodliwe, ponieważ nadal będzie używać bieżącej wartości, gdy zostanie uruchomione - ale nie zareaguje, jeśli zmieni się wartość. – JeremyK

2

Istnieje kilka małych problemów, więc nie jestem pewien, jak rozwiązać problem, ale tutaj jest kilka rzeczy do adres.

Publish Metoda

  • Zmienna lokalna user nigdy nie jest używany. Czy próbowałeś użyć ?
  • Nie trzeba zawierać userId jako parametr funkcji, ponieważ masz dostęp do this.userId
  • profil bieżącego użytkownika są publikowane domyślnie, więc nie trzeba używać publikowania/subskrypcji, jeśli nie chcesz, aby włączyć/wyłączyć pola, ale potem chciałbym zdefiniować Meteor.publish(null, ...) tak, że przesłania domyślny prąd publikacja obsługi

Uwaga: Jeśli usuniesz publikować usersAllforCustomer funkcję, nie zapomnij, aby usunąć go z drogi updateCustomerProfile

Użyj globalnego Helper currentUser

Oto jak zaktualizować szablon używać currentUser zamiast

<template name="updateCustomerProfile"> 
    <div class="container"> 
    <h1>Edit User</h1> 
    {{#with currentUser}} 
     {{#autoForm collection="Users" doc=this id="profileForm" type="update"}} 
     <fieldset> 
      {{> afQuickField name='username'}} 
      {{> afObjectField name='profile'}} 
     </fieldset> 
     <button type="submit" class="btn btn-primary">Update User</button> 
     <a class="btn btn-link" role="button" href="{{pathFor 'adminDocuments'}}">Back</a> 
     {{/autoForm}} 
    {{else}} 
     Nothing 
    {{/with}} 
    </div> 
</template> 

nadzieję, że to pomaga.

Powiązane problemy