私がやろうとしているのは、ember-cli-mirage をこの todo アプリhttps://github.com/ember-cli/ember-cli-todosに統合することです。このアプリは Ember 2.0 以降を使用しています。セットアップ:
- todo アプリのクローンを作成し、アプリ ディレクトリに cd します。
- シェル > npm インストール
- shell> bower のインストール
- シェル>エンバーサーブ
アプリが宣伝どおりに機能していることを確認しました (ここでは関係のない小さなことを除いて)。Todo アイテムを作成、更新、および削除できます。todo アプリは、ember-data-fixture-adapter/FIXTURES を使用してアプリにデータをシードします。
ember-cli-mirage を統合するために行った手順は次のとおりです。
- app/models/todo.js の Todo.reopenClass ブロック (FIXTURES/seed データを作成するコード) をコメント アウトします。
- app/adapters ディレクトリを削除しました (このディレクトリには、1 つのファイル application.js のみが含まれます (「export { default } from 'ember-data-fixture-adapter';」という 1 行のみが含まれます))。このディレクトリ全体が FIXTURES セットアップにのみ使用されることは確かです。
- shell> ember install ember-cli-mirage
- こちらの手順に従って ember-cli-mirage パーツ (app/mirage/{config.js,factories/post.js,scenarios/default.js}) をセットアップしますhttp://www.ember-cli-mirage.com/docs/ v0.1.x/working-with-json-api/ .
app/mirage/{config.js,factories/post.js,scenarios/default.js} のコードを投稿しますが、これは基本的に ember-cli-mirage の指示のコピーにすぎません。ページ (「user」モデル名を「post」に置き換えたもの)。
エンバーサーバーを再起動しました。todo アイテムの削除を除いて、すべて正常に動作します。レコードの削除は、ポインタを todo アイテムの右側に移動すると表示される「x」ボタンを押すことで実行されます。レコード削除の save() 部分で失敗することがわかりました。(「x」ボタン インターフェイスを使用して) レコードを削除するためのコードは、app/components/todo-item/component.js にあり、次のようになります。
removeTodo() {
var todo = this.get('todo');
todo.deleteRecord();
todo.save();
}
Todo アイテムを削除しようとすると、ブラウザー コンソールに "Successful request: DELETE /todos/n" ("n" は todo ID) が出力され、スタック トレースと共に不可解なエラー メッセージが出力されます。
「todo.save();」をコメントアウトしました。上の行。Todo アイテムを削除しても削除は失敗しますが、コンソールでは、"Successful request: DELETE /todos/n" メッセージの後にエラー メッセージが表示されなくなりました。
そこで、エラー メッセージをより明確にするために、上記の removeTodo コードを変更しました。私はこれを次のように変更しました:
todo.save().then(function() {
console.log('Save OK.');
}).catch((err) => {
console.log('Save failed.');
console.log(err.message);
});
あちこちでさまざまな変更を試みましたが、一貫して表示されるエラーメッセージは次のとおりです。
アサーションが失敗しました: アダプターは、既に ID を持つレコードに新しい ID を割り当てることができません。id: 3 を持っていて、未定義で更新しようとしました。これは、サーバーが、送信した ID とは異なる ID を持つ検索または更新に応答してデータを返したために発生した可能性があります。
「normalizeserializer...」のようなエラー メッセージが表示されましたが、メッセージ全体をコピーするのを忘れていました。
アダプターを追加しました:
shell> ember g adapter application
// app/adapters/application.js
import DS from 'ember-data';
export default DS.JSONAPIAdapter.extend({
});
しかし、これはそれを修正しませんでした。
ところで、todo アイテムの保存も呼び出す todo アイテムの作成は機能します。コードは app/components/todos-route/component.js にあります。
createTodo() {
const store = this.get('store');
// Get the todo title set by the "New Todo" text field
var title = this.get('newTitle');
if (title && !title.trim()) {
this.set('newTitle', '');
return;
}
// Create the new Todo model
var todo = store.createRecord('todo', {
title: title
});
// Clear the "New Todo" text field
this.set('newTitle', '');
// Save the new model
todo.save();
}