0

私はこの問題に1日半立ち往生しています。私がやろうとしているのは、Meteor.User コレクションに userProfile セクションを作成することです。そのため、ユーザーが「設定」ページにアクセスすると、情報を更新できます。これが私が持っているものです。

ちなみに、サインイン/サインアップ手順にはUser Accountsパッケージを使用しています。

更新: 3 フォームは送信されますが、データは挿入/更新されません。「Schema.User」をコメントアウトしたのは、それを入れて Meteor.users.attachSchema(Schema.User) に添付した場合です。自動フォームがフィールドをロードします。そのため、代わりに Schema.UserProfile を配置しました。コンソール ログを確認したところ、"[アクセスが拒否されました] 403" というエラーが表示されました。ここにリストされているすべてのコードがあります。

設定 HTML:

<template name="settings">
<div class="text-center light-container" id="settings-section">
    {{> quickForm collection="Meteor.users" doc=currentUser id="userProfile" type="update"}}
</div>

両方のディレクトリの設定 JS

    Schema = {};

Schema.UserProfile = new SimpleSchema({
    userProfile: {
        type: Object
    },
    'userProfile.firstName':{
        type: String,
        label: "First Name",
        max: 80
    },
    'userProfile.lastName':{
        type: String,
        label: "Last Name",
        max: 80
    },
    'userProfile.gender':{
        type: String,
        label: "Gender",
        allowedValues: ["Male", "Female"]
    },
    'userProfile.birthday':{
        type: Date,
        label: "Date Of Birth",
        autoform: {
            type: "bootstrap-datepicker"
        }
    },
    address:{
        type: Object
    },
    'address.city':{
        type: String,
        label: "City/Province",
        max: 80
    },
    'address.state':{
        type: String,
        label: "State",
        max: 80
    },
    'address.country':{
        type: String,
        label: "Country",
        max: 80
    },
    /*privacy:{
        type: String,
        label: "Privacy",
        allowedValues: ["On", "Off"]
    }, */
    aboutYou:{
        type: String,
        label: "About You",
        autoform: {
            afFieldInput: {
                type: "textarea"
            }
        },
        max: 400
    },
    socialNetworks:{
        type: Object,
        label: "Social Networks"
    },
    'socialNetworks.facebook':{
        type: String,
        label: "Facebook",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.instagram':{
        type: String,
        label: "Instagram",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.tumblr':{
        type: String,
        label: "Tumblr",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.twitter':{
        type: String,
        label: "Twitter",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    }
});


/* 
    Schema.User = new SimpleSchema({
        username: {
            type: String,
            regEx: /^[a-z0-9A-Z_]{3,15}$/,
            optional: true
        },
        emails: {
            type: [Object],
            // this must be optional if you also use other login services like facebook,
            // but if you use only accounts-password, then it can be required
            optional: true
        },
        "emails.$.address": {
            type: String,
            regEx: SimpleSchema.RegEx.Email
        },
        "emails.$.verified": {
            type: Boolean
        },
        createdAt: {
            type: Date
        },
        profile: {
            type: Schema.UserProfile,
            optional: true
        },
        services: {
            type: Object,
            optional: true,
            blackbox: true
        }/*,

        // Add `roles` to your schema if you use the meteor-roles package.
        // Option 1: Object type
        // If you specify that type as Object, you must also specify the
        // `Roles.GLOBAL_GROUP` group whenever you add a user to a role.
        // Example:
        // Roles.addUsersToRoles(userId, ["admin"], Roles.GLOBAL_GROUP);
        // You can't mix and match adding with and without a group since
        // you will fail validation in some cases.
        roles: {
            type: Object,
            optional: true,
            blackbox: true
        }

        */
    }); 

*/

Meteor.users.attachSchema(Schema.UserProfile);

Meteor.users.allow({
    insert: function(userId, doc) {
        // only allow posting if you are logged in
        console.log("doc: " + doc + " userId: " + userId);
        return !! userId;
    },
    update: function(userId, doc) {
        // only allow updating if you are logged in
        console.log("doc: " + doc + " userId: " + userId);
        return !! userId;
    },
    remove: function(userID, doc) {
        //only allow deleting if you are owner
        return doc.submittedById === Meteor.userId();
    }
});

クライアント ディレクトリの設定 JS

/*
    var postHooks = {
        before: {
            insert: function(doc) {
                if(Meteor.userId()){
                    doc.userId = Meteor.userId();
                }

                return doc;
            }
        },
        docToForm: function(doc) {
            if (_.isArray(doc.tags)) {
                doc.tags = doc.tags.join(", ");
            }
            return doc;
        },
        formToDoc: function(doc) {
            if (typeof doc.tags === "string") {
                doc.tags = doc.tags.split(",");
            }
            return doc;
        }
    };

    AutoForm.addHooks('UserProfile', postHooks);

*/

誰かが私を正しい方向に向けることができれば、それは本当に役に立ちます!!

4

2 に答える 2

0

プロファイルのスキーマを作成し、それをフィールドのユーザー オブジェクトのスキーマに割り当てる必要がありますprofile。私はあなたのために以下のことをしました。

var Schema = {};

Schema.UserProfile = new SimpleSchema({
   firstName:{
        type: String,
        label: "First Name",
        max: 80
    },
    lastName:{
        type: String,
        label: "Last Name",
        max: 80
    },
    gender:{
        type: String,
        label: "Gender",
        allowedValues: ["Male", "Female"]
    },
    birthday:{
        type: Date,
        label: "Date Of Birth",
        autoform: {
            type: "bootstrap-datepicker"
        }
    },
    address:{
        type: Object
    },
    'address.city':{
        type: String,
        label: "City/Province",
        max: 80
    },
    'address.state':{
        type: String,
        label: "State",
        max: 80
    },
    'address.country':{
        type: String,
        label: "Country",
        max: 80
    },
    /*privacy:{
        type: String,
        label: "Privacy",
        allowedValues: ["On", "Off"]
    }, */
    aboutYou:{
        type: String,
        label: "About You",
        autoform: {
            afFieldInput: {
                type: "textarea"
            }
        },
        max: 400
    },
    socialNetworks:{
        type: Object,
        label: "Social Networks"
    },
    'socialNetworks.facebook':{
        type: String,
        label: "Facebook",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.instagram':{
        type: String,
        label: "Instagram",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.tumblr':{
        type: String,
        label: "Tumblr",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
    },
    'socialNetworks.twitter':{
        type: String,
        label: "Twitter",
        autoform: {
            placeholder: 'Username'
        },
        max: 50
   }
});

Schema.User = new SimpleSchema({
    username: {
        type: String,
        regEx: /^[a-z0-9A-Z_]{3,15}$/,
        optional: true
    },
    emails: {
        type: [Object],
        // this must be optional if you also use other login services like facebook,
        // but if you use only accounts-password, then it can be required
        optional: true
    },
    "emails.$.address": {
        type: String,
        regEx: SimpleSchema.RegEx.Email
    },
    "emails.$.verified": {
        type: Boolean
    },
    createdAt: {
        type: Date
    },
    profile: {
        type: Schema.UserProfile,
        optional: true
    },
    services: {
        type: Object,
        optional: true,
        blackbox: true
    },
    // Add `roles` to your schema if you use the meteor-roles package.
    // Option 1: Object type
    // If you specify that type as Object, you must also specify the
    // `Roles.GLOBAL_GROUP` group whenever you add a user to a role.
    // Example:
    // Roles.addUsersToRoles(userId, ["admin"], Roles.GLOBAL_GROUP);
    // You can't mix and match adding with and without a group since
    // you will fail validation in some cases.
    roles: {
        type: Object,
        optional: true,
        blackbox: true
    }
});

Meteor.users.attachSchema(Schema.User);

許可ルールと拒否ルールについては、ログインしているかどうかを確認するだけでなく、userId がドキュメントの _id と一致することを確認したい場合があります。

于 2015-10-05T17:34:24.057 に答える