【发布时间】: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