Conversation
xhr @v2.3 suggests that the `json` option should be a boolean, and the data should be set on `body`. While the behaviour is backwards compatible, I figure it would be a good idea to match its behaviour.
…where the explicitly provided body should take precedence over the model’s data.
core.js
Outdated
| if (options.emulateJSON) { | ||
| params.headers['content-type'] = 'application/x-www-form-urlencoded'; | ||
| params.body = params.json ? {model: params.json} : {}; | ||
| params.body = params.json ? {model: params.body || params.json} : {}; |
There was a problem hiding this comment.
Trying to think of the condition where params.json would be true, and there would be no params.body. This would result in params.body being set to {model: true} which seems incorrect.
If params.json is true, it means new lines 70 and 71 ran above, which means params.body has to be set to either options.attrs or model.toJSON(options). So at the bare minimum it's already set to {};
Following this logic I believe that this line should read:
params.body = params.json ? { model: params.body } : {};
There was a problem hiding this comment.
Yep, you're right.
The case this was attempting to address was if somebody passed a non-boolean truthy value to json in options. Except now I realize this is json in params, which will always be (true || undefined).
Making this change shortly.
|
This looks great, thanks for staying on top of this change. +1 from me |
|
Great thinking, this could have been considered a bug before! |
|
@naugtur tests have been broken across all Ampersand modules for about a year now :( I don't have the expertise or access to fix the CI tests. |
|
👍 |
|
Tests ran from PRs from external repos will always fail, only tests made from PRs from local branches will run. |
Recently, xhr clarified its behaviour for the
jsonoption, suggesting thatjsonis flipped on/off, and thebodyis instead set to… the body. This has the side effect of preventing true/false being sent as a value via thejsonoption, but is otherwise backwards compatible.This PR is mostly to bring ampersand-sync inline with how xhr prefers its data, but also solves one very specific, confusing use case that would fail (without this PR). I'll try to explain it:
In short, this should make
.syncoptions behaviour more congruent withxhr'soptionsbehaviour. While usingbodyis not an option specified within ampersand-sync's documentation, anddatashould probably be the preferred way to pass data, sometimes it's tricky to remember which property to use (body or data) when switching between usingxhrandampersand-sync.Overall, this PR shouldn't introduce any breaking changes.