Итак, я разработал простую систему тегирования, следуя этому 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, который требуется плагину, вы можете проверить документацию по плагину.Тем не менее, я все еще могу успешно возвращать предложения, основанные на том, что пользователь вводит ... поэтому я не уверен, что происходит.