我有一些前端 javascript 向我的后端 rails 服务器发出异步 http 请求。在前端,我没有使用 XHR(我使用axios,尽管这与问题并不完全相关)。
在请求中,我设置了以下内容来告诉服务器我正在发送 JSON 并确保我得到 JSON:
const config = {
headers: {
"Content-Type": "application/json",
"Accept": "application/json"
}
};
Run Code Online (Sandbox Code Playgroud)
在我的后端 Rails 控制器中,如果检查请求,我可以验证Accept标头:
> request.headers
"HTTP_ACCEPT"=>"application/json, text/plain, */*"
Run Code Online (Sandbox Code Playgroud)
然而 ActionPack/Rails 仍然不尊重这一点并默认为format存在:html
> request.format
=> #<Mime::Type:0x00007fe223919f80 @hash=-1773238723920954657, @string="text/html", @symbol=:html, @synonyms=["application/xhtml+xml"]>
Run Code Online (Sandbox Code Playgroud)
这是为什么?
我知道我可以附加.json到我的请求 URL 以“强制”它指定该格式,但这是唯一的选择吗?我可以轻松地附加它,但它似乎是特定于 Rails 的实现,而不是真正的“正确”方法。
此外,该方法的源代码request.format明确设置:json为 XHR 请求的格式 - rails 目前是否只尊重 XHR 请求?
谢谢!
我的前端 UI 中有一个“复制链接”按钮。单击时,输入框中的 URL 将使用以下 JS 复制到用户的剪贴板:
const copyTextarea = document.querySelector("#copy-link-button");
copyTextarea.focus();
copyTextarea.select();
document.execCommand('copy');
Run Code Online (Sandbox Code Playgroud)
当我在本地试用时,此功能运行良好,因此我知道该功能本身运行正常。
但是我无法用 Capybara 测试副本。我从这篇文章中知道 Capybara 不提供剪贴板 API,但我的解决方法是 -
我的测试:
# Copy the link
page.find("#copy-link-button").click
wait_for_ajax
# Visit some other page that I know has an input/text field
visit account_settings_path
input = page.find("#user_email")
# Clear the field
fill_in("user[email]", with: "")
# Paste in the contents of the clipboard
input.base.send_keys([:control, "v"])
# Validate
expect(input.value).to eq("some value");
Run Code Online (Sandbox Code Playgroud)
但是,没有任何内容粘贴到该输入(input.value并input.text返回 …
我用来webpack捆绑一些简单的 JS 文件/模块。
webpack 输出(未缩小)如下所示:
(self["webpackChunktest-project"] = self["webpackChunktest-project"] || []).push([[179],{
/***/ 4:
/***/ (() => {
// ...
// <MY BUNDLED CODE HERE>
// ...
/***/ })
},
/******/ __webpack_require__ => { // webpackRuntimeModules
/******/ "use strict";
/******/
/******/ var __webpack_exec__ = (moduleId) => (__webpack_require__(__webpack_require__.s = moduleId))
/******/ var __webpack_exports__ = (__webpack_exec__(4));
/******/ }
]);
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将我的代码包装在一些 webpack 模块化逻辑中。
有什么办法可以删除这个包装逻辑吗?我希望只生成一个纯 JS 文件作为输出,而不使用样板包装器。
注意:因为我设置optimzation.runtimeChunk为true(请参见下面的配置),webpack所以创建了一个单独的运行时文件(此处未显示)以及上面显示的最小包装的 JS 文件。
这里是webpack.config.js …
我有一个组件可以异步获取数据 componentDidMount()
componentDidMount() {
const self = this;
const url = "/some/path";
const data = {}
const config = {
headers: { "Content-Type": "application/json", "Accept": "application/json" }
};
axios.get(url, data, config)
.then(function(response) {
// Do success stuff
self.setState({ .... });
})
.catch(function(error) {
// Do failure stuff
self.setState({ .... });
})
;
}
Run Code Online (Sandbox Code Playgroud)
我对组件的测试如下所示 -
it("renders the component correctly", async () => {
// Have API return some random data;
let data = { some: { random: ["data to be …Run Code Online (Sandbox Code Playgroud)