我有一个小的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-source
和ember-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请求发送到适当端点的更简单的解决方案。