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.wins
在 entry.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-source
和 ember-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 请求。
我有一个小井字游戏,并且有计分板功能。我做了一个 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.wins
在 entry.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-source
和 ember-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 请求。