2015-10-08 12 views
7

私のアプリで何がうまくいかないのか分かりません。ユーザープロファイルを更新しようとしています。ユーザーがすでにプロファイルを持っている場合は、そのプロファイルの現在の値が表示されます。私はSimpleSchemaをユーザコレクションに添付しています。Meteor updateユーザープロフィール

<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> 

私はテンプレートヘルパーを持っている:

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' 
    }); 
    } 
}); 

、最終的には、以下の出版物:

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

私はオートフック

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()'); 
     } 
     } 
    } 
    }); 

を持っているには、次のルートを持っています:

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}); 
    } 
}); 

そしてここに集まりです:

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); 

私は、ユーザーオブジェクトが文書に渡されると確信しています。私は、プロファイルを更新することはできません:(オートデバッグから)、次のエラーを取得:

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" 

あなたのbefore AutoForm Hooksを変更する必要がどのようにブラインドを見つめ、プロフィールの更新について移動する....

+0

スキーマの関連部分を投稿することはできますか? – challett

+0

元の質問を編集してそれを含めました。 – wiwa1978

+0

安全でないパッケージを使用していますか?そうでない場合は、許可されたユーザーがユーザープロファイルを更新できるように、コレクションのアクセス許可を設定してください。 –

答えて

0

実際にメテオールが問題を解決しました。ヘルパーに間違いがありました。実際には、元のコードはでした:

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

したがって、上記のスニペットに私が代わりに「ヘルパー」の「イベント」を使用していました。以下は正しいコードです:

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

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

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

afterコールバックは、JS標準(error, result)機能シグネチャを有しているが、beforeコールバックはただ1つのパラメータ/更新を挿入するドキュメントを持っています。これは、あなたが常に「エラー」を記録している理由です。挿入したいのは単なるドキュメントです。また、それを返すか、実際にdbにオブジェクトを挿入/更新するためにthis.resultに渡す必要があります。私はあなたの問題に取り組むするかどうかはわかりませんので

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

私は確かそれを見たことがあります。指摘してくれてありがとう!しかし、あなたの提案に変更しても、それは動作しません。新しいユーザーをMongoに挿入することはできますが、既存のユーザーを更新することはできません。 Autohookには、docを出力するconsole.logがあります。エラーは表示されませんが、何とかMongoデータベースが更新されていないかのように見えます。何か案は? – wiwa1978

+0

本当に。あなたができる最良のことは、[mcve]を作成することでしょう。なぜなら、この質問はそこから離れているからです。そうすることで、より多くの人々が支援することができるという疑問が生まれます。それは価値があります。自動フォームフックを使用せず、フローを必要としない例を作成してください:router、alanning:rolesなど上記の問題を見つけるために偶然見つけ出すことがたくさんありました。私が嘲笑したものは、あなたには別の問題があります。とにかく、私はメテオパッドで働いているものを手に入れてリンクを張ります。 – JeremyK

+1

ルータからの反応がないので、flow:routerがRoute SubscriptionsブロックのMeteor.userId()を好きではないというエラーが発生しました。しかし、私はそれが実行時には現在の値を使用するので、これはかなり無害であると信じていますが、値が変更されても応答しません。 – JeremyK

2

はカップルの小さな問題がありますが、ここでは対処するためのいくつかのものがあります。

はメソッド

  • を公開するローカル変数userが使用されることはありません。 を使ってみましたか?
  • あなたが含めたい場合を除き、パブリッシュ/サブスクライブを使用する必要はありませんので、現在のユーザーのプロファイルがデフォルトで公開されているthis.userId
  • へ のアクセス権を持っているので、関数のパラメータとしてuserIdを含めるする必要はありません/フィールドを除外し、あなたがusersAllforCustomer機能を公開する削除した場合、ルートupdateCustomerProfile

    からそれを削除することを忘れないでください:それは

注デフォルト現在のユーザーの出版物をオーバーライドするように、その後私はMeteor.publish(null, ...)を定義します

使用グローバルヘルパーcurrentUser

ここでは代わりに

<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> 

currentUserを使用するようにテンプレートを更新する方法です。この情報がお役に立てば幸いです。

関連する問題