Задать вопрос

Как отправлять id, а не value в форме с Select2?

Есть приложение на Ruby on Rails, где можно на странице редактирования поста задать посту страну, вот код input'a (использую simple form):

= f.input :country, label: t("heading.country"), as: :string, input_html: { class: 'select2', data: { allowadd: true, depth: 0, id: post.location.country.id, url: search_locations_path } }


В CoffeeScript'e я подключаю select2

loadSelect2 = (selector = '.select2') ->
  $(@).select2
    ajax:
      data: (term, page) ->
        search: term
        depth: $(@).data('depth')
      results: (data, page) ->
        results: data
      url: $(@).data('url')
    createSearchChoice: (term, data) ->
      if $(data).filter(->
        @title.localeCompare(term) is 0
      ).length is 0
        id: term
        title: term
    createSearchChoicePosition: 'bottom'
    formatResult: (item) ->
      item.title
    formatSelection: (item) ->
      item.title
    initSelection: (element, callback) ->
      callback
        id: $(element).data('id')
        title: $(element).val()


То же самое, но в ванильном:

var loadSelect2;

loadSelect2 = function(selector) {
  if (selector == null) {
    selector = '.select2';
  }
  return $(this).select2({
    ajax: {
      data: function(term, page) {
        return {
          search: term,
          depth: $(this).data('depth')
        };
      },
      results: function(data, page) {
        return {
          results: data
        };
      },
      url: $(this).data('url')
    },
    createSearchChoice: function(term, data) {
      if ($(data).filter(function() {
        return this.title.localeCompare(term) === 0;
      }).length === 0) {
        return {
          id: term,
          title: term
        };
      }
    },
    createSearchChoicePosition: 'bottom',
    formatResult: function(item) {
      return item.title;
    },
    formatSelection: function(item) {
      return item.title;
    },
    initSelection: function(element, callback) {
      return callback({
        id: $(element).data('id'),
        title: $(element).val()
      });
    }
  });
};


Так, я могу выбрать страну из списка или добавить вручную, если в списке нет вариантов. Начальные значения я получаю из val() input'a и data-id input'a, это описывается в функции initSelection.

Если я выберу какую-либо страну из списка и отправлю форму, то всё работает как задумывалось: в переменной post_params['country'] оказывается id, то есть число. Если же я отправлю форму не меняя выбора страны, то вместо id я получаю value выбранной по умолчанию страны, а нужно id.

Что я делаю не так и как исправить?
  • Вопрос задан
  • 3674 просмотра
Подписаться 1 Оценить Комментировать
Решение пользователя Сергей К ответам на вопрос (4)
sintyalev
@sintyalev
Сейчас стал использовать gem "select2-rails"
Есть презентация на Хабрахабр - Как мы Select2 в хелпер заворачивали
Очень удобно, есть документация с примерами.
Ответ написан