Хорошо, я нетерпеливый ... через некоторое время я нашел решение, которое работает для меня. Я не знаю, лучший ли это способ, но я хочу показать это.
Мне пришлось изменить решение Райана Бейтса: Railscast "Ассоциация автозаполнения" , которая обрабатывает ассоциацию own_to, чтобы заставить ее работать с HABTM.
В моем фрагменте формы есть новое текстовое поле с именем tag_names, которое ожидает список тегов через запятую.
Как и Райан, я использую виртуальный атрибут для получения и установки тегов. Я думаю, что остальное не требует пояснений, поэтому вот код.
Просмотр "_snippet.html.erb"
<div class="float tags">
<%= f.label :tag_names, "Tags" %>
<%= f.text_field :tag_names %>
</div>
Модель "snippet.rb":
def tag_names
# Get all related Tags as comma-separated list
tag_list = []
tags.each do |tag|
tag_list << tag.name
end
tag_list.join(', ')
end
def tag_names=(names)
# Delete tag-relations
self.tags.delete_all
# Split comma-separated list
names = names.split(', ')
# Run through each tag
names.each do |name|
tag = Tag.find_by_name(name)
if tag
# If the tag already exists, create only join-model
self.tags << tag
else
# New tag, save it and create join-model
tag = self.tags.new(:name => name)
if tag.save
self.tags << tag
end
end
end
end
Это просто базовый код, не очень хорошо протестированный и нуждающийся в улучшении, но, похоже, он работает, и я рад, что нашел решение!