Причина, по которой ваши ссылки хранятся не по порядку, заключается в том, что вы не представляете их в БД по порядку.
- Объект param не является массивом, хотя в некоторой степени он может выглядеть как один. Скорее, это хеш, где ключи являются целыми числами. Вы можете сказать, что это правда, потому что вам нужно использовать
params[:links].values.collect
если бы это был массив, вы бы использовали
params[:links].collect
Каждый раз, когда вы используете метод .values, порядок ключей не определен.
Решение
Я согласен с @ p.g, что вы должны быть очень осторожны при использовании идентификаторов db в качестве заказа. Например, предположим, вы хотите изменить порядок позже? У меня часто в списке есть поле list_order.
Чтобы изменить порядок параметров и сохранить в порядке расположения клавиш, попробуйте следующее:
links_param = params[:links]
ordered_keys = links_param.keys.sort
@links = ordered_keys.collect {|key| @user.links.new(links_param[key])}
Добавлено: также обратите внимание, что ключи могут входить в виде строк, а не целых чисел. Так что, если у вас их более 10, может быть идея отсортировать их как целые числа:
ordered_keys = links_param.keys.sort{|a,b| a.to_i <=> b.to_i}
<ч />
Добавлено в ответ на комментарий о сохранении "display_order" -
Сначала добавьте новое поле в модель: display_order. Обязательно добавьте индекс в поле, так как вы будете сортировать его.
Затем в вашем контроллере вам нужно выставить ключ к модели. Например, что-то вроде этого:
links_param = params[:links]
links_params.keys.each{|key|links_params[key][:display_order] = key.to_i}
Теперь, когда вы создаете свой объект user.link, параметр display_order также будет установлен.