Sinatra Ruby перебирает массив в хэше для отправки jQuery Sortable в базу данных - PullRequest
0 голосов
/ 24 февраля 2012

Я ограничил свое отсутствие знаний этим фрагментом, который я продолжаю настраивать в irb. Я пытаюсь использовать пользовательский интерфейс jQuery Sortable для отправки сообщения в базу данных, поэтому я могу заставить его отправлять обновление, но одновременно отправляет весь массив вместо каждого элемента массива. Удивительно, что я еще не нашел ни одного поста с кем-то, кто пробовал Синатру и Сортабле. Ммм

Код хеша и синатры

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 есть элементарная вещь, по которой я скучаю.

Ниже приведен эквивалент Rails, который я в конечном итоге хотел бы клонировать в Sinatra, но там тоже есть мелочи,

.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

Обновление

В Синатре я пытаюсь сохранить номер файла данных в этом случае как

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

Ответы [ 2 ]

0 голосов
/ 24 февраля 2012

Это то, что вы ищете?(основываясь на вашем обновлении)

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

Пока сложно сказать, что вы хотите, потому что ваши два обновления немного отличаются, но я думаю, что вам нужно, чтобы лучше использовать итераторы для хэша исодержащийся массив.Это подготовит вас к созданию «Требуемого выхода», который вы дали.Надеюсь, это поможет.

Редактирование на основе вашего последнего обновления.Я думаю, что вы хотели перебрать v в строке 5 нового кода.Я предполагаю, что 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
0 голосов
/ 24 февраля 2012

Я не уверен в том, что вы хотите сделать:

, но для вашего желания выводит этот код:

superslide = {"weee"=>["3", "4", "1", "2"]}


superslide.each do |o|

    ai = superslide['weee']
    ai.each {|x| puts "#{x}\n event"}
end

если я вас понимаю, это должно работать:

superslide ["weee"]. Каждый {| x |datafilenumber.save = x}

Перебирает все элементы массива и сохраняет их.

...