act_as_taggable_on и select2 возвращают странные результаты в Active Admin

Итак, я играл с acts_as_taggable_on в активном администраторе, и по большей части все работает, как ожидалось.

Однако всякий раз, когда я ищу теги и добавляю к модели тег существующий, он, кажется, сохраняет его как идентификатор, а не как имя. Создание новых тегов возвращает имя в порядке, и когда я снова перехожу к редактированию объекта, теги остаются помеченными по имени. Но когда я пытаюсь добавить еще один тег, который уже существует в базе данных, он возвращает имя в форме и, кажется, сохраняет ОК, но когда я снова возвращаюсь, чтобы отредактировать onject, тег отображается как идентификатор, скорее чем имя.

In admin/gift.rb:

controller do
  def autocomplete_gift_tags
    @tags = ActsAsTaggableOn::Tag
      .where("name LIKE ?", "#{params[:q]}%")
      .order(:name)
    respond_to do |format|
      format.json { render json: @tags , only: [:id, :name], root: false }
    end
  end
end

In tag-autocomlete.js:

$(document).ready(function() {
  $('.tagselect').each(function() {
    var placeholder = $(this).data('placeholder');
    var url = $(this).data('url');
    var saved = $(this).data('saved');
    $(this).select2({
        tags: true,
        placeholder: placeholder,
        minimumInputLength: 1,
        initSelection: function(element, callback) {
            saved && callback(saved);
        },
        ajax: {
            url: url,
            dataType: 'json',
            data: function(term) {
                return {
                    q: term
                };
            },
            results: function(data) {
                return {
                    results: data
                };
            }
        },
        createSearchChoice: function(term, data) {
            if ($(data).filter(function() {
                return this.name.localeCompare(term) === 0;
            }).length === 0) {
                return {
                    id: term,
                    name: term
                };
            }
        },
        formatResult: function(item, page) {
            return item.name;
        },
        formatSelection: function(item, page) {
            return item.name;
        }
    });
  });
});

А в моем _gift_form.html.erb:

<%= f.input :tag_list, label: "Tags", input_html: { data: { placeholder: "Enter tags",  saved: f.object.tags.map{|t| {id:  t.name, name: t.name}}.to_json, url: autocomplete_gift_tags_path }, class: 'tagselect' } %>

Не могу понять, почему новые работают, а существующие нет.


person RustComet    schedule 14.07.2014    source источник


Ответы (1)


измените это:

respond_to do |format|
  format.json { render json: @tags , only: [:id, :name], root: false }
end

к этому:

respond_to do |format|
  format.json { render :json => @tags.collect{|t| {:id => t.name, :name => t.name }}}
end
person sanny    schedule 21.08.2014
comment
Я мог бы поцеловать тебя прямо сейчас. Также спасибо @RustComet за то, что задали все правильные вопросы - person David Sigley; 24.08.2014