我只是有点'呃'时刻,但我有一个菜单项列表,我可以排序并使用jquery ui的序列化方法序列化数据。我正在提交ajax请求,并在webrick中看到以下参数:
参数:{ "sort" => "menu[]=2&menu[]=3&menu[]=1&menu[]=4" }
最终,我只想拥有一个2,3,1,4
列表并编写一个sql查询来更新这些项的sort_order。到目前为止我发现的大多数教程都只有PHP服务器端示例,而人们只是params['sort']['menu']
返回2,3,1,4
但在Ruby中似乎返回一个空对象。
这是我的jquery代码:
$(document).ready(function() {
$(".sortable").sortable({
update : function (){
$.ajax({
type : "POST",
url : "/page_parts/sort/",
data : {
sort : $(".sortable").sortable('serialize')
}
});
}
});
});
这是我的标记:
<ul class="sortable">
<% @page_parts.each do |f| %>
<li id="menu_<%= f.id %>"><%= f.title %></li>
<% end %>
</ul>
这是我的控制器代码:
def sort
raise params['sort']['menu'].inspect
end
那将返回:
Started POST "/page_parts/sort/" for 127.0.0.1 at 2011-10-12 06:19:38 -0400
Processing by PagePartsController#sort as */*
Parameters: {"sort"=>"menu[]=1&menu[]=2&menu[]=4&menu[]=3&menu[]=5"}
Completed 500 Internal Server Error in 0ms
RuntimeError ("menu"):
app/controllers/page_parts_controller.rb:9:in `sort'
如果另一方面我尝试:
def sort
raise params['sort'].inspect
end
我明白了:
Started POST "/page_parts/sort/" for 127.0.0.1 at 2011-10-12 06:19:10 -0400
Processing by PagePartsController#sort as */*
Parameters: {"sort"=>"menu[]=1&menu[]=2&menu[]=3&menu[]=5&menu[]=4"}
Completed 500 Internal Server Error in 0ms
RuntimeError ("menu[]=1&menu[]=2&menu[]=3&menu[]=5&menu[]=4"):
答案 0 :(得分:5)
这是你的问题,就像我怀疑的那样:
data : {
sort : $(".sortable").sortable('serialize'),
},
serialize
返回如下字符串:menu[]=2&menu[]=3&menu[]=1&menu[]=4
。然后,您将该字符串分配给新对象中名为sort
的属性,并将该对象作为data
参数提供。因此,实际上将POST
数据发送到服务器的内容如下所示:
POST /page_parts/sort/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
sort=menu%5B%5D%3D2%26menu%5B%5D%3D3%26menu%5B%5D%3D1%26menu%5B%5D%3D4
..哪个Rails(正确地)解释为具有解码值sort
的单个参数menu[]=2&menu[]=3&menu[]=1&menu[]=4
。
看看我要去哪里?您需要将该序列化字符串直接发送到服务器作为 POST
数据,而不是将该序列化字符串设置为 it 作为另一个参数的值。解决这个问题很简单。将您的$.ajax
电话改为:
$.ajax(
{ type : 'POST',
url : '/page_parts/sort/',
data : $('.sortable').sortable('serialize') // on its own, no object
}
);
这将按照您的意愿发送到服务器:
POST /page_parts/sort/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded
menu[]=2&menu[]=3&menu[]=1&menu[]=4
..并且Rails会收到您的期望:
>> params
# => { :menu => [ 2, 3, 1, 4 ] }
>> params[:menu]
# => [ 2, 3, 1, 4 ]