6

我想向我的 ruby​​ 控制器发送一个 javascript 数组。我有点失落。我的问题在控制器中。这是我到目前为止所拥有的:

(totalChanges 是一个数组数组。JSON.stringify(totalChanges) 可能如下所示:

[[4,2,"","15"],[4,3,"","12"],[4,4,"","14"]]

应用程序/视图/index.html.erb:

<div id="dataTable" class="dataTable" style="width: 680px;height: 300px; overflow: scroll"></div>
<button>Save!</button>
<script>
    var first = true;
    var totalChanges = new Array();
    $("#dataTable").handsontable({
         //...some code that generates appropriate array totalChanges
    });
    var data = //..some code
    $("#dataTable").handsontable("loadData", data);
    $(function() {
            $( "button").button();
            $( "button" ).click(function() { 
                    alert("clicked"); 
                    $.ajax({
                            type: "POST",
                            url: "/qtl_table/save",
                            data: {total_changes: JSON.stringify(totalChanges)},
                            success: function() { alert("Success!"); }
                    });
            });
    });

</script>

应用程序/控制器/qtl_table_controller.rb:

def save
  //Adding some things suggested by answers:
  logger.debug "\n#{params[:total_changes].first}, #{params[:total_changes][1]}\n"
  ar = JSON.parse(params[:total_changes])
end

我最终遇到了这些错误:

NoMethodError (You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.first):

编辑:我也有 contentType:“application/json”和 Accepts:“application/json”,当我把它们拿出来时,一切都解决了。多谢你们 :)

4

3 回答 3

12

JSON.parse是你的朋友:

ar = JSON.parse(params[:total_changes])
#=> [[4, 2, "", "15"], [4, 3, "", "12"], [4, 4, "", "14"]]

您很可能需要将 AJAX 调用更新为:

$.ajax({
  type: "POST",
  url: "/qtl_table/save",
  data: { total_changes: JSON.stringify(totalChanges) },
  success: function() { alert("Success!"); }
});

给你的数组参数total_changes名称。

于 2012-06-26T15:51:28.983 回答
4

在 javascript 中为 JSON 数据分配一个根节点

data: {qtls: totalChanges}

现在在控制器中:

params[:qtls] # contains the Ruby array
params[:qtls].first # [4,2,"","15"]
于 2012-06-26T15:59:31.830 回答
1

传递的数据应该位于您的 params 环境变量中的某个位置。似乎您不知道它在哪个环境变量中。如果您知道它是哪个环境变量,那么该变量将保存您正在传递的变量,在您的情况下,json 字符串是数组。一旦您知道如何访问它,您就可以更新/创建/保存或您需要做的任何事情,然后重定向到您的索引:

redirect_to qtl_tables_path

如果您不知道变量的名称,通常检查参数会告诉您它是如何传递的。当我想知道这样的事情并查看传递给控制器​​的所有内容时,我会将其发送到具有视图的不同控制器操作。在这种观点中,我将提出类似的内容:

<%= debug params %>

或者

<%= inspect params %>

这样它会打印出正在传递的参数,我可以看到该变量在哪里以及如何在参数中访问它,然后在正确的控制器中使用它。

这有意义吗?这篇文章中的答案也应该对您有所帮助:

Rails:如何打印请求参数?

它也有一些很好的例子,可以使用你的 rails logger 来打印它。

我希望这是答案可以帮助你。

于 2012-06-26T15:55:20.810 回答