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 => :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.stringify
和JSON.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 控制器的主要内容,如果未能解决你的问题,请参考以下文章