Выполнение чего-либо перед сохранением формы, используемой с HABTM
-
21-09-2019 - |
Вопрос
В настоящее время у меня есть 3 таблицы.
сниппет теги snippet_tags
Я использую HABTM.
Итак, я создал форму для сохранения фрагмента с тегами.Ключевые слова находятся в текстовом поле, разделенном запятыми.
Что мне нужно сделать, это взять строку из этого текстового поля, перебрать ключевые слова, проверить, существуют ли они, если нет, создать их, а затем сохранить фрагмент.
Я пробовал с помощью before_save, но, похоже, это не так..
Так что, если бы вы могли мне помочь, это было бы здорово!
Большое спасибо!
Решение
Я думаю, что ответ Джозефла довольно хорош.Хотя, я бы сделал все это в действии snippets_controller:
def create
@snippet = Snippet.new(params[:snippet])
@snippet.tags = params[:tags].split(',').collect { |tag| Tag.find_or_create_by_name(tag) }
if @snippet.save
# do something when successful
else
# do something when saving failed
end
end
Извините за это длинное, однострочное заявление.;-)
Я не тестировал код, но надеюсь, что он сработает.
Tag.find_or_create_by_name
будет делать именно это:когда тег с таким именем существует, он вернет его, в противном случае он создаст новый тег "на лету" и вернет его.
Таким образом, теги уже сохранены, до того , как ты звонишь @snippet.save
.
Пожалуйста, обратите внимание, что я просто предположил, как называются ваши переменные и параметры.
Другие советы
Вот версия вашего create
способ.Основное изменение заключается не в создании Snippet_Tag
.Если ваша ассоциация HABTM настроена правильно, то в вашем сниппете будет коллекция тегов, в которую вы сможете добавить свои теги.Коллекция будет сохранена как Snippet_Tag
ы по ActiveRecord
.Смотрите на руководство по ассоциациям рельсов для получения более подробной информации об ассоциациях HABTM.
def create
# Creating the snippet
@snippet = Snippet.new
@snippet.title = params[:snippet][:title]
@snippet.content = params[:snippet][:content]
# loop through the tags
params[:snippet][:tags].split(',').collect do |tag_string|
tag_string.strip!
if tag_string.length > 0
# Find or create tag
tag = Tag.find_or_create_by_name(tag_string)
# Add tag to tags collection
@snippet.tags << tag
end
end
if @snippet.save
# do something when successful
else
# do something when saving failed
end
end
- Используйте split, чтобы разбить вашу строку на массив тегов
- Найдите каждый тег по названию
- Если не найден, то создайте тег
- Добавьте тег к фрагменту кода
- Сохраните фрагмент (в вашем контроллере)
Пример метода для размещения в вашей модели фрагмента
def add_tags(tag_list_string)
tag_array = tag_list_string.split ','
tag_array.each do |tag_name|
tag = (Tag.find_by_name(tag_name) || Tag.create(:name => tag_name))
self.tags << tag
end
end
Попробуй before_update
?