2011-10-12 14 views
1

我在刚有点“杜”的时刻,但我有我犯了排序,并已系列化使用jQuery用户界面的序列化方法的数据菜单项列表。我提交Ajax请求,并和看到的WEBrick以下参数:回报率,阿贾克斯,可排序,Seralize

参数:{ "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

请告诉我们你的表单标记和JavaScript代码。这看起来像是客户端的问题。如果你有'menu [] = 2&menu [] = 3'等等在查询字符串中,Rails会正确地将它变成一个数组('{“menu”=> [2,3,...]})。这里发生的事情是,你的jQuery代码正在将一个查询字符串并将其放入一个名为'sort'的GET参数(可能是URL编码它)。 –

+0

这是要点标记 https://gist.github.com/1280787 – jdkealy

+0

啊谢谢! 我知道我必须做一些愚蠢的事情。 – jdkealy

回答

4

这是你的问题,就像我怀疑:

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 

..这滑轨(正确地)解释为与解码值menu[]=2&menu[]=3&menu[]=1&menu[]=4一个参数sort

看到我这个打算?而不是采取的是连续字符串设定作为另一个参数的值,你需要的是序列化的字符串直接发送到服务器POST数据。解决这个问题很简单。更改$.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 ]