代码之家  ›  专栏  ›  技术社区  ›  vin_Bin87

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

  •  0
  • vin_Bin87  · 技术社区  · 8 年前

    所以我在州里有一块地 bullet_points: [] 这是一个元素数组。

    我的组件中有一个函数,用于从该数组中添加/删除元素。要保存更改,单击提交将发送 product: this.state 作为发送到后端的POST请求中的参数。

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

    这是什么原因造成的?下面是相关的代码片段。

    1) 添加/删除元素的功能(注意箭头,这是删除元素的地方)

      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) 将请求发布到后端

    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));
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Adam Berman    8 年前

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

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

    2) 如果确实要发送空数组(发送空数组和根本不发送键/值之间可能有区别?),然后用一个空字符串或其他一些值发送数组,这些值可能不是有效的输入,但您将检查这些值,以表示数组为空。

    我以前遇到过一件棘手的事情——如果您使用rspec进行测试,那么rspec的post方法 没有 如果值是空数组,则删除键/值;它按原样发送数据。因此,您可能需要添加表示客户端数据外观的其他测试 之后 它已序列化。