【问题标题】:Sinatra Ruby iterate over an array in a hash to send jQuery Sortable to databaseSinatra Ruby 遍历散列中的数组以将 jQuery Sortable 发送到数据库
【发布时间】:2012-02-24 03:46:57
【问题描述】:

我将我缺乏知识的原因归结为我在 irb 中不断调整的这段代码。 我正在尝试使用 jQuery 的 UI Sortable 将帖子发送到数据库,到目前为止,我可以让它发送更新,但它一次发送整个数组而不是每个数组项。 令人惊讶的是,我还没有找到有人尝试 Sinatra 和 Sortable 的帖子。嗯

哈希和 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[]=>value 所以我猜输出会是,使用更简单的设置

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

西纳特拉路线

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

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

【问题讨论】:

  • 这个应该输出什么?您有 Rails 等价物,但我没有看到您的 Sinatra 尝试与 Rails 示例之间的关系。
  • 我已经更新了上面的帖子底部的输出

标签: ruby sinatra jquery-ui-sortable


【解决方案1】:

这就是你要找的吗? (根据您的更新)

superslide = {"weee"=>["3", "4", "1", "2"]}
superslide.each do |k,ai|      # |key, value| i.e. |"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

【讨论】:

  • 接近了!我用你的代码在底部调整了路线。我还清理了变量和命名,并将坚持这些。抱歉,这是我知道我是否正确使用 var 的方式。我还将 Sinatra Route 放入其中,它使用 datamapper 和 sql
  • 更改一个 var 会引发一个未定义的方法“每个”。哈希和数组没有改变,仍然和之前的 superslide 一样。现在尝试检查它们。未发送新代码。
  • 我猜你的params['slide'] 实际上是一个字符串,而不是一个哈希。 String 类没有可以解释错误的方法#each。否则,它应该使用更新的变量名。
  • 嗯,奇怪,我在上面发布了一些课程并检查了结果。另一方面,如何在这些注释框中粘贴和格式化代码?反引号必须换行吗?还是还需要四个空格?
  • @tripdragon 我想我明白了。检查代码和实际路线之间的细微差别是问题所在。
【解决方案2】:

我不确定你想做什么:

但对于您想要的输出,此代码可以工作:

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}

它遍历数组中的每个元素并保存它们。

【讨论】:

  • 谢谢,但是,虽然输出会在控制台中输出,但通过添加 var print 对其进行的测试给了我之前遇到的问题。以上更新
猜你喜欢
  • 2023-04-10
  • 2018-06-29
  • 2019-01-31
  • 2012-08-03
  • 2020-12-02
  • 2018-09-26
  • 2015-08-12
  • 2016-08-03
  • 1970-01-01
相关资源
最近更新 更多