RoR,Ajax,可排序,Seralize

jdk*_*aly 1 ruby serialization ruby-on-rails jquery-ui-sortable

我只是有点'呃'时刻,但我有一个菜单项列表,我可以排序并使用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')
        }
      }); 
    }   
  }); 
});
Run Code Online (Sandbox Code Playgroud)

这是我的标记:

<ul class="sortable">
  <% @page_parts.each do |f| %>
    <li id="menu_<%= f.id %>"><%= f.title %></li>
  <% end %>
</ul>
Run Code Online (Sandbox Code Playgroud)

这是我的控制器代码:

def sort
  raise params['sort']['menu'].inspect
end 
Run Code Online (Sandbox Code Playgroud)

那会回来:

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'
Run Code Online (Sandbox Code Playgroud)

如果另一方面,我尝试:

def sort
  raise params['sort'].inspect
end 
Run Code Online (Sandbox Code Playgroud)

我明白了:

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"):
Run Code Online (Sandbox Code Playgroud)

Jor*_*ing 5

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

data  : {
  sort : $(".sortable").sortable('serialize'),
},
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

..哪些Rails(正确)将解释后sort的值解释为单个参数menu[]=2&menu[]=3&menu[]=1&menu[]=4.

看看我要去哪里?而不是采取的是序列化的字符串和设置作为另一个参数的值,你需要的是序列化的字符串直接发送到服务器作为POST数据.解决这个问题很简单.将您的$.ajax电话改为:

$.ajax(
  { type  : 'POST',
    url   : '/page_parts/sort/',
    data  : $('.sortable').sortable('serialize') // on its own, no object
  } 
);
Run Code Online (Sandbox Code Playgroud)

这将按您的要求发送到服务器:

POST /page_parts/sort/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded

menu[]=2&menu[]=3&menu[]=1&menu[]=4
Run Code Online (Sandbox Code Playgroud)

..和Rails会收到你的期望:

>> params
# => { :menu => [ 2, 3, 1, 4 ] }
>> params[:menu]
# => [ 2, 3, 1, 4 ]
Run Code Online (Sandbox Code Playgroud)