Ember 3.19更新记录并将其保存在API中的正确方式



我有一个小的Tic-Tac-Toe游戏,我有记分板功能。我制作了一个Rails API,它将保存这些分数的全局列表。

对我来说,从Ember更新Rails后端记录的正确方式是什么?

目前我正在努力工作的是:

在我的application.js路线中,我有

async model() {
return {
score: this.store.findAll('score')
}
}

我的game路由器有

model() {
return {
score: this.store.peekAll("score")
}
}

在我的game.hbs模板中,我在game.js控制器中有一个带有onClicksendScore()方法的按钮。该方法将在存储中查找特定的用户名(用户可以输入一个用户名,在该用户名下,他们的分数将保存在rails DB中(,找到用户后,它应该做的是将该用户的分数设置为等于localStorage项目。

sendScore() {
const entry = this.store.peekAll('score').filterBy("username", localStorage.getItem("username"))[0]
entry.wins = parseInt(localStorage.getItem("wins"));
entry.losses = parseInt(localStorage.getItem("losses"));
entry.draws = parseInt(localStorage.getItem("draws"));
entry.save();
}

但这行不通。

作为当前发生的事情的一个例子

我从用户名"开始;damion";其中150胜146平318负。

如果我在entry.wins = parseInt...之后控制台.logentry.wins,则该记录已清楚地使用localStorage中的任何内容进行了更新。然而,在调用entry.save()时,Ember发出的PATCH请求的值与最初的值没有变化。

做这件事的正确方法是什么?

编辑:我的Ember Datascore型号看起来像这个

import Model, { attr } from '@ember-data/model';
export default class ScoreModel extends Model {
@attr username;
@attr wins;
@attr draws;
@attr losses;
}

非常简单的模型。我的适配器只有host = localhost:3000,里面没有其他东西。

ember-sourceember-data均为~3.19.0版本

在调用save()之前,我还在行中使用了entry.changedAttributes()进行了检查,确信Ember可以看到我更改了值。

draws: (2) [146, 0]
losses: (2) [318, 5]
wins: (2) [150, 56]

我想我已经发现了这个问题。

Ember在通过JSON:neneneba API规范序列化后会对事物进行POST/PATCH处理,问题是我的Rails后端没有接收到请求的主体,因为它只在寻找URLParams。

在这一点上有几个选项,我只是选择了将手动POST/PATCH请求发送到适当端点的更简单的解决方案。

最新更新