小编abh*_*and的帖子

为什么 rails 无法识别请求标头中的“Accept: application/json”?

我有一些前端 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 请求?

谢谢!

json ruby-on-rails xmlhttprequest http-accept-header

7
推荐指数
1
解决办法
1748
查看次数

使用 Selinum + Capybara 模拟剪贴板复制/粘贴

我的前端 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,但我的解决方法是 -

  1. 使用“复制链接”按钮复制链接
  2. 导航到其他一些输入/文本字段
  3. 使用 CTRL+V 粘贴到该字段中并读取该字段的内容以进行验证

我的测试:

# 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.valueinput.text返回 …

selenium rspec capybara

6
推荐指数
1
解决办法
2122
查看次数

删除 Webpack 的模块包装器以生成纯 JS 脚本

我用来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.runtimeChunktrue(请参见下面的配置),webpack所以创建了一个单独的运行时文件(此处未显示)以及上面显示的最小包装的 JS 文件。

Webpack 配置

这里是webpack.config.js …

javascript node.js webpack

5
推荐指数
0
解决办法
913
查看次数

使用 Jest + react-testing-library 测试异步 `componentDidMount()`

我有一个组件可以异步获取数据 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)

javascript reactjs jestjs react-testing-library

4
推荐指数
1
解决办法
4409
查看次数