Sinatra Ruby在散列中迭代数组以将jQuery Sortable发送到数据库

我已经把我缺乏的知识分解为这个片段,我一直在调整irb。 我正在尝试使用jQuery的UI Sortable将post发送到数据库,到目前为止我可以让它发送更新,但它一次发送整个数组而不是每个数组项。 令人惊讶的是,我还没有找到一个人试过Sinatra和Sortable的post。 嗯

哈希和sinatra代码

superslide = {"weee"=>["3", "4", "1", "2"]} moo = Sort.all moo.each do |o| o.sortorder = superslide['weee'] puts o.sortorder end #Output 3412 3412 3412 3412 

在上面你可以看到它为每个循环将数组值分成一行。 我知道我缺少一个Ruby基本的东西。

下面是我最终希望克隆到Sinatra的Rails等价物,但是那里的小东西也搞砸了

 .index(book.id.to_s) + 1 

抛出一个错误,我想因为它是一个字符串,我试过to_i但它只编辑了同一组数字。

Rails代码翻译

 def sort @books = Book.all @books.each do |book| book.position = params['book'].index(book.id.to_s) + 1 book.save end 

http://practiceovertheory.com/blog/2009/08/07/sortable-lists-with-jquery-in-rails/

我也测试了如何在哈希中迭代数组,原谅不同的名称,我有很多测试路由,我现在无法用测试代码。

  slideNum.sortorder = params['slide'].each do |k,v| k.each { |x| puts x } end 

如果需要,jQuery可排序

 var foo = $( "#sortable" ).sortable({ update: function(event, ui){ $.ajax({ type: 'post', // data: $('#books').sortable('serialize'), data: foo.sortable("serialize",{key:'bunny[]'}), dataType: 'script', url: '/sort' }); }, change: function(){console.log(foo.sortable("serialize",{key:'bunny[]'}))} }); 

我假设需要输出。

我希望它启动它的更新方法并保存一个hash => key [] =>值所以我想输出将是,使用更简单的设置

 superslide = {"weee"=>["3", "4", "1", "2"]} superslide.each do |o| ai = superslide['weee'] puts ai puts "event" end 

想要输出

 3 event 4 event 2 event 1 event 

当前不需要输出

 Instead of 3 4 2 1 event 

更新

在Sinatra中,我试图在这种情况下保存datafilenumber

 datafilenumber.save = wee[0] # =1 datafilenumber.save = wee[1] # =2 etc… 

更新测试

 superslide = {"weee"=>["3", "4", "1", "2"]} superslide.each do |o| ai = superslide['weee'] datafilenumber = ai.each {|x| "#{x}"} puts "box + #{datafilenumber}" end #Outputs box + 3412 

Sinatra路线

当前输出数字并保存到数据库但数字相同,因此所有幻灯片都成为一个值。 越来越接近!

 post '/sort' do sortall = Sort.all slidevar = params['slide'] slidevar.each do |k,v| k.each do |x| sortall.update(:sortorder => x) puts x puts v.object_id end end end 

用检查和课程进行测试

 slidevar = params['slide'] puts params.inspect # {"slide"=>["3", "2", "1", "4"]} puts params.class # Hash puts slidevar.inspect # ["3", "2", "1", "4"] puts slidevar.class # Array 

这是你想要的? (根据您的更新)

 superslide = {"weee"=>["3", "4", "1", "2"]} superslide.each do |k,ai| # |key, value| ie |"weee", ["3", "4", "1", "2"]| ai.each do |x| # will give you "3", "4", "1", "2" on iterations datafilenumber.save = x # not sure what this was in your update # do whatever other actions you need to do end end 

告诉你想要什么仍然有点难,因为你的两个更新有点不同,但我认为你需要更好地利用你的哈希和包含数组的迭代器。 这使您准备好创建您给出的“通缉输出”。 希望这可以帮助。

根据您最近的更新进行修改。 我想你想在新代码的第5行迭代v 。 我假设slidevar与之前处理的哈希值相同( superslide )。

编辑#2:仔细查看您的检验代码。 你正在检查params ,一个哈希,然后params['slide'] ,一个数组。 但是,您的代码将params['slide']视为散列本身。 (或者我在整个代码集中感到困惑。但无论哪种方式都可行:)

 post '/sort' do sortall = Sort.all # slidevar = params['slide'] params.each do |k,v| # with only one, it's equivalent to params['slide'] v.each do |x| sortall.update(:sortorder => x) puts x puts v.object_id end end end 

或者你可以这样做:

 post '/sort' do sortall = Sort.all slidevar = params['slide'] slidevar.each do |x| sortall.update(:sortorder => x) puts x end end 

我不确定你想做什么:

但是为了你的愿望输出这个代码将工作:

 superslide = {"weee"=>["3", "4", "1", "2"]} superslide.each do |o| ai = superslide['weee'] ai.each {|x| puts "#{x}\n event"} end 

如果我理解你这应该工作:

superslide [“weee”]。each {| x | datafilenumber.save = x}

它迭代数组中的每个元素并保存它们。