Как мне настроить этот плагин автозаполнения? - PullRequest
3 голосов
/ 01 апреля 2011

Итак, я разработал простую систему тегирования, следуя этому Railscast , и она работает как нужно.Теперь я хочу объединить эту систему тегов с автозаполнением, и здесь я столкнулся с проблемой.Смешивание исходного кода с плагином может привести к путанице: /

Я использую этот плагин автозаполнения и по умолчанию он добавляет выбранные элементы в текстовое поле.Однако я хочу настроить это несколькими способами:

Я не хочу, чтобы теги появлялись внутри поля после того, как пользователь выберет предложение.У меня уже есть теги, появляющиеся над текстовым полем, когда они выделены.

У меня есть теги, появляющиеся над полем через AJAX, который срабатывает после того, как пользователь нажимает кнопку, которая отправляет запрос POST в действие обновления.Когда я реализую плагин, он позволяет мне добавлять только предложенные теги, а не новые.Когда я пытаюсь добавить новый тег (которого нет в предлагаемом списке), в соответствии с моими журналами мой запрос POST отображает хэш параметров с именем тега в виде пустой строки.Есть что-то в автозаполнении, не находящем строку, которая стирает ее с отправки с помощью запроса POST.Без использования автозаполнения моя система тегов работает нормально с новыми тегами.

Если я выбираю тег из списка предложений, тег добавляется, но отображает номер идентификатора тега вместо имени тега.Мои журналы показывают, что хэш params содержит имя тега в качестве идентификатора тега.Этого не должно быть.

Я знаю, что это много вопросов / проблем, но я бы очень признателен за помощь в этом.

Вот мой код для установки простых тегов w/ o автозаполнение.Это в моей модели видео (ресурс помечен), и он устанавливает topic_names как виртуальный атрибут:

attr_accessor :topic_names
after_save :assign_topics

def assign_topics
if @topic_names
  self.topics << @topic_names.map do |name|
    Topic.find_or_create_by_name(name)
  end
 end
end

А в моем видеопоказе форма для добавления тегов:

<%= form_for @video, :remote => true do |f| %>
  <div class="field">
  <%= f.text_field :topic_names, :class => "topic_field" %>
  </div>
  <%= f.submit "Add Topic" %>
<% end %>

Это также в видеопоказе, размещенном над формой.Он просматривает теги для этого видео и отображает их:

<div class="topic_holder">
<% @video.topics.uniq.each do |topic| %>
  <%= link_to "#{topic.name}", "#", :class => 'topic_style round' %>
<% end %>

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

Теперь эта система тегов работает нормально, но я хочу совместить это с автозаполнением, чтобы, когда вы начинаете печатать, она показывала вам выбор уже примененных тегов.Если вы выберете предложенный тег, я хочу, чтобы он появился над полем.Если вы введете новый тег, я также хочу, чтобы он появился над полем.И если вы выберете тег, который уже был добавлен в видео, я не хочу, чтобы он появился снова.Кроме того, я не хочу, чтобы теги появлялись внутри поля тегов.

Теперь я реализовал плагин автозаполнения с этим кодом.Давайте начнем с модели темы, где я создаю эту именованную область:

scope :search, lambda {|q| where("name LIKE ?", "%#{q}%") }

Затем в действии index контроллера тем:

def index
    @topics = Topic.search(params[:q])
    respond_to do |format|
     format.html 
     format.json {render :json => @topics.map(&:attributes).to_json}
    end
  end

А затем в application.js:

$(".topic_field").tokenInput("/topics", {
        hintText: "Start typing in a topic...",
        theme: "facebook",
        preventDuplicates: true
    }); 

Как только я реализую этот плагин автозаполнения, генерация списка предложений работает правильно.Однако я сталкиваюсь со всеми проблемами, упомянутыми в верхней части вопроса, в этой огромной стене текста.Как мне настроить этот плагин, чтобы он соответствовал моим желаниям, и сочетать его с моим собственным кодом RoR?

ОБНОВЛЕНИЕ:

С кодом выше мой JSON неправильно форматируется в соответствии с моим Chromeотладчик:

[{"name":"ssdd","created_at":"2011-04-01T04:33:52Z","updated_at":"2011-04-01T04:33:52Z","id":37},{"name":"dsdds","created_at":"2011-04-01T05:12:57Z","updated_at":"2011-04-01T05:12:57Z","id":43}]

Чтобы проверить правильный формат JSON, который требуется плагину, вы можете проверить документацию по плагину.Тем не менее, я все еще могу успешно возвращать предложения, основанные на том, что пользователь вводит ... поэтому я не уверен, что происходит.

1 Ответ

1 голос
/ 01 апреля 2011

Хорошо, поэтому я решил эту проблему, переключившись на плагин автозаполнения пользовательского интерфейса jQuery.Похоже, что по сравнению с плагином, который я изначально планировал использовать, плагин jQuery UI включает в себя немного больше кода для настройки, но он гораздо более восприимчив к настройке.Вот действительно хорошее объяснение того, как использовать плагин пользовательского интерфейса jQuery с Rails: Как настроить автозаполнение jquery-ui в Rails

Я в значительной степени скопировал и вставил код изпервый ответ в ссылке, которую я разместил, и автозаполнение очень хорошо работает с моим пользовательским кодом RoR.

Мне все равно было бы интересно услышать, как настроить другой плагин.

...