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

Ember 3.19 Proper way of updating a record and saving it in an API

我有一个小井字游戏,并且有计分板功能。我做了一个 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 控制器中有一个带有 onClick sendScore() 方法的按钮。此方法将查看特定用户名的商店(用户可以输入用户名,他们的分数将保存在 rails 数据库中),找到用户后,它应该做的是为此设置分数user 等于 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 负。

如果我 console.log entry.winsentry.wins = parseInt... 之后,记录显然已更新为 localStorage 中的任何内容。但是,在调用 entry.save() 时,Ember 发出的 PATCH 请求的值与原来的值没有变化。

这样做的正确方法是什么?

编辑:我的 Ember 数据 score 模型如下所示

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:API 规范序列化后会 POST/PATCH 事情,问题是我的 Rails 后端没有接收正文的请求,因为它只是在寻找 URL Params.

此时有几个选项,我只是采用了更简单的解决方案,即向适当的端点发送手动 POST/PATCH 请求。