【问题标题】:ajax + rails - post data value disappearingajax + rails - 发布数据值消失
【发布时间】:2018-01-30 00:47:45
【问题描述】:

我正在开发一个 Rails 应用程序。我有一些 JS 数据要发送到 rails。问题是,我的 ajax 请求中的一个值在 rails 的params 中不存在,当它从 JS 到控制器时。

首先,触发它的是这个顶层

if (prospects.length > 0) {
  _self.sendData(prospects);
} else {
  alert('must submit more than 1 prospect');
}

这个函数看起来像这样

sendData: function(prospects) {
    var prospects = prospects;
    var user_id = $('#user_id').val();
    var team_id = $('#team_id').val();

    var data = {
      prospects: prospects,
      user_id: user_id,
      team_id: team_id
    }

    // data looks like (from chrome console)
   // {prospects: Array(2), user_id: "950", team_id: ""}    

    $.ajax({
      url: '/path/to/url/',
      type: 'PUT',
      dataType: 'json',
      data: data,
      success: function(data) {
        console.log('success from sendData!');
        console.log(data);
      },
      error: function(error) {
        console.log('error from sendData');
        console.log(error);
      }
    });
  }

在上面的这个函数中,我看到了我所有的值。那么接下来,就是 rails 控制器了

def process
    p '*' * 100
    p params
    p '*' * 100
end

这些p 语句的输出是 “****************************************************** ****************************************************** *" {"user_id"=>"950", "team_id"=>"", "action"=>"method_name", "controller"=>"name/of/controller"} “****************************************************** ****************************************************** *"

如您所见,params[:prospects] 为零!我没有看到我的错误,也不知道为什么该值没有进入控制器。

有人知道为什么params[:prospects] 不存在吗?

更新

我能够通过将 $.ajax 数据包装在 jQuery 的 $.param() 函数中来使其工作。我的工作功能是这样的

sendData: function(prospects) {
        var prospects = prospects;
        var user_id = $('#user_id').val();
        var team_id = $('#team_id').val();

        var data = {
          prospects: prospects,
          user_id: user_id,
          team_id: team_id
        }

        var json_data = $.param(data);  

        $.ajax({
          url: '/path/to/url/',
          type: 'PUT',
          dataType: 'json',
          data: json_data,
          success: function(data) {
            console.log('success from sendData!');
            console.log(data);
          },
          error: function(error) {
            console.log('error from sendData');
            console.log(error);
          }
        });
      }

【问题讨论】:

  • 尝试使用JSON.stringify()将数据转换为字符串格式,看看是否有帮助
  • @Subash 感谢您的回答。我认为需要对此进行修改(但我似乎找不到任何文档来支持这一点)。在$.ajax 调用中,将data: data 更改为data: JSON.stringify(data) 确实将prospects 添加到params,但会将所有数据组合到一个键中。它输出格式如下:{"{\"prospects\":"=>{"{},{}"=>{",\"user_id\":\"950\",\"team_id\":\"\"}"=>nil}}。有什么建议?我几乎可以肯定我以前做过这样的事情,并且不需要这种程度的努力来清理参数(现在可能不同,因为它是一个对象数组)
  • prospects 持有什么价值?
  • @Subash 在我上面提供的示例中,prospects 将是一个 JS 对象数组。
  • 这些JS对象是否代表模型对象,如果是那么您可以传入ids并在后端检索它们以降低复杂性

标签: jquery ruby-on-rails ruby ajax


【解决方案1】:

令人困惑的是,$.ajaxdataType 选项没有设置数据对象的类型。它设置服务器响应中预期的类型。因此,您必须添加:

...
data: JSON.stringify({yada: 'yada'})
contentType: 'application/json'
...

Rails 将通过params 函数接收并提供您所期望的内容。

希望对你有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-11-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-18
    • 2016-07-22
    • 2010-11-17
    • 2023-02-07
    相关资源
    最近更新 更多