React/Rails 状态中的字段未发送到 POST 请求中的后端

React/Rails field in state not sent to backend in POST request

所以我在状态 bullet_points: [] 中有一个字段,它是一个元素数组。

我的组件中有一个函数可以从这个数组中获取 adds/removes 个元素。要保存更改,单击提交会将 product: this.state 作为 POST 请求中的参数发送到我的后端。

如果数组不为空,后端仅接收 bullet_points。如果我清除所有元素的字段,它永远不会发送到后端。

什么会导致这种情况?以下是相关的代码片段。

1) add/remove 个元素的函数(注意箭头,这是删除元素的地方)

  updateList(evt) {
    evt.preventDefault();

    let elements = this.state[evt.target.dataset.type];
    let idx = parseInt(evt.target.dataset.index);
    let new_element = evt.target.dataset.type == "durations" ? 30 : "";

    if (isNaN(idx)) {
      elements.push(new_element);
    } else {
      if (evt.target.dataset.delete) {      <----------
        elements.splice(idx, 1);
      }
      else {
        elements[idx] = evt.target.value;
      }
    }
    this.setState({ [evt.target.dataset.type]: elements });
  }

2) POST 向后端请求

API.put(`coach/products/${this.props.params.id}`, {
    product: this.state
  }, function(res) {
    this.closeModal();
    Alert.success('<p class="small-body-text">Your changes have been saved</p>', {
      position: "top-right",
      effect: "scale",
      timeout: 5000
    });
  }.bind(this));

如果值为空数组,许多序列化和 post 数据的库不会发送 key/value 对。例如:jQuery has this behavior。基本上有两种方法可以处理此问题:

1) 在后端,检查 post 参数中的密钥是否存在。如果不存在,则将其视为空数组。

2) 如果你真的想发送一个空数组(也许发送一个空数组和根本不发送 key/value 是有区别的?),然后用一个空字符串发送数组或者一些其他值可能不是有效输入,但您将检查是否表示数组为空。

我之前 运行 遇到过一件棘手的事情 - 如果您使用 rspec 进行测试,rspec 的 post 方法 如果值为空数组,则 not 删除 key/value;它按原样发送数据。因此,您可能想要添加额外的测试来表示客户端数据在 序列化后的样子。