Вложенная ошибка маршрутизации 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()