Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器

Posted

技术标签:

【中文标题】Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器【英文标题】:Ruby on Rails: send javascript array of arrays to ruby controller 【发布时间】:2012-06-27 22:47:54 【问题描述】:

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

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

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

app/views/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>

app/controllers/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”,当我把它们拿出来时,一切都解决了。谢谢大家:)

【问题讨论】:

【参考方案1】:

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 命名。

【讨论】:

谢谢,这看起来很棒。我也对渲染什么或如何工作感到困惑。在我的控制器中执行一些逻辑后,如何让页面重新加载 index.html.erb 完成所有工作后,您可以执行redirect_to :action =&gt; :index,这会将用户重定向到届时应该已经刷新内容的index 操作。 我现在有:NameError (未初始化的常量 QtlTableController::JSON): app/controllers/qtl_table_controller.rb:26:in `save' 嗯,也许你在控制器文件的顶部缺少require 'json'。或者你可以试试ActiveSupport::JSON.decode 我在 Gemfile 中也缺少 gem 'json'【参考方案2】:

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

data: qtls: totalChanges

现在在控制器中:

params[:qtls] # contains the Ruby array
params[:qtls].first # [4,2,"","15"]

【讨论】:

是否需要对整个数据散列进行字符串化?不记得了,暂时无法查看。 @KL-7,不,不是(api.jquery.com/jQuery.post)。我只是复制并粘贴了他的代码。 你们有什么推荐的?我只是想把我从精彩的互联网中学到的点点滴滴联系起来 @KandadaBoggu,在没有JSON.stringifyJSON.parse的情况下,控制器会自动转储和恢复阵列吗? 只要用户发帖到.json扩展名,数据就会自动转换。【参考方案3】:

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

redirect_to qtl_tables_path

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

<%= debug params %>

<%= inspect params %>

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

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

Rails: How do I print the request parameters?

它也有一些很好的例子来使用你的 Rails 记录器来打印它。

希望这个答案对你有帮助。

【讨论】:

以上是关于Ruby on Rails:将数组的 javascript 数组发送到 ruby​​ 控制器的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on Rails:以表单提交数组

Ruby on Rails - 使用符号数组获取对象关联值

Ruby on Rails - 从数组中删除某些内容

ruby on rails (模型关联查询)

ruby on rails (函数使用)

当我尝试从 ruby​​ on rails 上的表单获取输入时,我得到了简单名称的哈希数组瞬间。如何解决?