Вложенная ошибка маршрутизации Ember.JS и Rails

У меня есть приложение ember-rails, которое содержит таблицу серверов и ссылку на каждый отдельный сервер.

Вот основной servers.handlebars файл:

<table id="box-table-a">
    <thead> 
        <th>Name</th> 
        <th>Operating System</th> 
        <th>Build Stage</th> 
    </thead> 
    <tbody> 
        {{#each server in controller}} 
        <tr> 
            <td>
                {{#link-to 'server' server}}
                    {{server.name}}
                {{/link-to}}
            </td> 
            <td>{{server.operating_system}}</td> 
            <td>{{server.build_stage}}</td> 
        </tr> 
        {{/each}}
    </tbody>
</table>

{{outlet}}

Что создает соответствующую таблицу, как и ожидалось. А при наведении курсора на имя сервера я получу URL в левом нижнем углу браузера: #/servers/1, #/servers/2, так далее

Однако, когда я нажимаю ссылку на отдельный сервер, шаблон сервера не отображается. Вот мой server.handlebars файл:

<div>
    <h2> {{name}} </h2>
    <h2> {{operating_system}} </h2>
    <h2> {{build_stage}} </h2>
</div>

Ниже мой server.js.coffee файл, расположенный в папке javascripts/models:

Warthog.Server = DS.Model.extend
  name: DS.attr('string')
  operating_system: DS.attr('string')
  build_stage: DS.attr('string')

мой serversRoute.js.coffee файл:

Warthog.ServersRoute = Ember.Route.extend
  model: -> @store.find('server')

мой serverRoutes.js.coffee файл:

Warthog.ServerRoute = Ember.Route.extend
    model: (params) ->
        @store.find('server', params.server_id)

Последний router.js.coffee файл

Warthog.Router.map ->
  @resource "servers", ->
    @resource "server", path: "/:server_id", ->
      @route "edit"
    @route "create"

Обратите внимание, что в наборе инструментов ember в Chrome не отображаются какие-либо маршруты и что ошибка выдается только в консоли при попытке перейти на отдельный сервер. Ниже приведена ошибка.

event.returnValue is deprecated. Please use the standard event.preventDefault() instead. jquery.js?body=1:5387
Ember Debugger Active VM3178:391
DEPRECATION: Action handlers contained in an `events` object are deprecated in favor of putting them in an `actions` object (error on <Ember.Route:ember430>)
        at Object.triggerEvent (http://testdomain.warthog.dev/assets/ember.js?body=1:30519:13)
        at trigger (http://testdomain.warthog.dev/assets/ember.js?body=1:29641:16)
        at handlerEnteredOrUpdated (http://testdomain.warthog.dev/assets/ember.js?body=1:29537:11)
        at http://testdomain.warthog.dev/assets/ember.js?body=1:29512:9
        at eachHandler (http://testdomain.warthog.dev/assets/ember.js?body=1:29559:9)
        at setupContexts (http://testdomain.warthog.dev/assets/ember.js?body=1:29511:7)
        at finalizeTransition (http://testdomain.warthog.dev/assets/ember.js?body=1:29835:7)
        at transitionSuccess (http://testdomain.warthog.dev/assets/ember.js?body=1:29732:13)
        at invokeCallback (http://testdomain.warthog.dev/assets/ember.js?body=1:8055:19) ember.js?body=1:394
Error while loading route: TypeError {} ember.js?body=1:394
Uncaught TypeError: Object function () {
    var Class = makeCtor(), proto;
    Class.ClassMixin = Mixin.create(this.ClassMixin);
    Class.PrototypeMixin = Mixin.create(this.PrototypeMixin);

    Class.ClassMixin.ownerConstructor = Class;
    Class.PrototypeMixin.ownerConstructor = Class;

    reopen.apply(Class.PrototypeMixin, arguments);

    Class.superclass = this;
    Class.__super__  = this.prototype;

    proto = Class.prototype = o_create(this.prototype);
    proto.constructor = Class;
    generateGuid(proto, 'ember');
    meta(proto).proto = proto; // this will disable observers on prototype

    Class.ClassMixin.apply(Class);
    return Class;
  } has no method 'create' 

1 ответ

Решение

Короткая

Это ошибка при использовании coffe с ember, возможно, вы используете SomeEmberObject.extend вместо SomeEmberObject.extend(),

Долго

Когда вы используете Foo = SomeEmberObject.extend без аргументов кофе генерирует следующий код:

var Foo;

// Foo is a reference to extend, this is not what we want 
Foo = SomeEmberObject.extend;

Так как Foo это просто возмещение, когда Foo.create() называется, это так же, как SomeEmberObject.extend.create() и выбросит вашу текущую ошибку.

Обервация: даже если вы не вызываете create прямо в своем коде, ember использует ваши объявленные классы и вызывает create при выполнении внедрения зависимостей.

С аргументами функция extends корректно вызывается:

Foo = SomeEmberObject.extend
  message: 'hello'

Формирует:

var Foo;

// ok
Foo = SomeEmberObject.extend({
  message: 'hello'
});

Поэтому вам нужно заменить в своем коде классы, объявленные как Foo = SomeEmberObject.extend в Foo = SomeEmberObject.extend(),

Например:

// wrong
Warthog.ServerController = Ember.ObjectController.extend

// correct
Warthog.ServerController = Ember.ObjectController.extend()
Другие вопросы по тегам