如何通过ajax向Rails 3控制器提交(post / put)复选框值而不将复选框包装在表单中?换句话说,如何将复选框序列化为没有表单的数组。
对此的任何帮助将非常感谢。谢谢!
以下是我要特别做的事情:
查看:
<ul>
<%= @items.each do |item|
<li>
<%= checkbox_tag_tag "item_ids[]", item.id, false,
:class => "item-checkbox" %>
<%= item.name %>
</li>
<% end %>
</ul>
控制器:
class ItemsController < ApplicationController
respond_to :html, :js, :json
.
.
.
def update_multiple_items
Item.update_all(
{ :category_id => params[:category_id] },
{ :id => params[:item_ids] }
)
end
end
Javascript(jQuery):
$("#update-link").click(function() {
var categoryId = 2;
var itemsArray = $(".item-checkbox:checked").serializeArray();
$.ajax({
type: "PUT",
url: "items/update_multiple_items",
data: {
category_id: categoryId,
items_ids: itemsArray
},
dataType: "script"
});
});
我收到Active Record错误,其中包含以下信息:
!ruby/hash:ActiveSupport::HashWithIndifferentAccessname: item_ids[]value: ''303'''
以下是请求参数:
Parameters:
{"parent_id"=>"7", "item_ids"=>{"0"=>{"name"=>"item_ids[]", "value"=>"302"}, "1"=>
{"name"=>"item_ids[]", "value"=>"303"}}}
答案 0 :(得分:2)
我不能肯定地说,但看起来您的$(".item-checkbox:checked").serializeArray();
可能存在问题。它不会产生一个简单的项目ID数组。相反,它会生成一个表示每个复选框的对象数组。
您想提交的数据格式是什么:
{"parent_id"=>"7", "item_ids"=> [1,2,3]}
您提交的内容:
{"parent_id"=>"7", "item_ids"=>{"0"=>{"name"=>"item_ids[]", "value"=>"302"}, "1"=> {"name"=>"item_ids[]", "value"=>"303"}}}
换句话说,$(".item-checkbox:checked").serializeArray();
生成的哈希值大致格式为:[{name: "item_ids[]", value: "302"},{name: "item_ids[]", value: "303"}]
但您只想提交[302,303]
或["302","303"]
。
我会做什么(使用下划线js示例):
var serializedArray = $("input:checked").serializeArray();
var itemIdsArray = _.map(serializedArray, function(item){
return item["value"];
});
# itemIdsArray should now be ["302","303"].. you can check by a console.log
console.log(itemIdsArray);
然后在你的ajax中提交这个数组:
$.ajax({
type: "PUT",
url: "items/update_multiple_items",
data: {
category_id: categoryId,
items_ids: itemsIdsArray
},
dataType: "script"
});
*非下划线示例*
如果你不使用underscorejs,这就是你如何写它。 (但是,我建议您查看它,它很棒:http://underscorejs.org/。它是一个包含许多易于使用的基本功能的小型库,人们不断地使用它们。)
var serializedArray = $("input:checked").serializeArray();
var itemIdsArray = [];
for (var i = 0, length = a.length; i < length; i++) {
itemIdsArray.push(serializedArray[i]['value']);
}