Search code examples
javascriptmeteormeteor-autoformmeteor-collection2simple-schema

Meteor using namedContext to addInvalidKeys to an AutoForm form returning an error


I have the following SimpleSchema where I am trying to add custom validation to validate against entering duplicate customer name, yet whenever I try to save a new customer I get error:

Exception in delivering result of invoking 'adminCheckNewCustomerName': TypeError: Cannot read property 'namedContext' of null

can someone please tell me what I am doing wrong / missing here to validate the customer name against duplicate records? Thanks

schema.js:

AdminSection.schemas.customer = new SimpleSchema({
    CustomerName: {
        type: String,
        label: "Customer Name",
        unique: true,
        custom: function() {
            if (Meteor.isClient && this.isSet) {
                Meteor.call("adminCheckNewCustomerName", this.value, function(error, result) {
                    if (result) {
                        Customer.simpleSchema().namedContext("newCustomerForm").addInvalidKeys([{
                            name: "CustomerName",
                            type: "notUnique"
                        }]);
                    }
                });
            }
        }
    }
});

UI.registerHelper('AdminSchemas', function() {
    return AdminSection.schemas;
});

form.html:

{{#autoForm id="newCustomerForm" schema=AdminSchemas.customer validation="submit" type="method" meteormethod="adminNewCustomer"}}
   {{>afQuickField name="CustomerName"}}
   <button type="submit" class="btn btn-primary">Save Customer</button>
{{/autoForm}}

collections.js:

this.Customer = new Mongo.Collection("customers");

Solution

  • Check collection2 code for fetching the schema attached to a collection:

    _.each([Mongo.Collection, LocalCollection], function (obj) {
      obj.prototype.simpleSchema = function () {
        var self = this;
        return self._c2 ? self._c2._simpleSchema : null;
      };
    });
    

    This cryptic homonym _c2 (one of two hard things in programming...) comes from attachSchema:

    self._c2 = self._c2 || {};
    //After having merged the schema with the previous one if necessary
    self._c2._simpleSchema = ss;
    

    Which means that you have forgotten to attachSchema or fiddled with the property of your collection.

    To solve:

    Customer.attachSchema(AdminSchemas.customer);
    //Also unless this collection stores only one customer its variable name should be plural