Выполнение чего-либо перед сохранением формы, используемой с HABTM

StackOverflow https://stackoverflow.com/questions/1760451

Вопрос

В настоящее время у меня есть 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
  1. Используйте split, чтобы разбить вашу строку на массив тегов
  2. Найдите каждый тег по названию
  3. Если не найден, то создайте тег
  4. Добавьте тег к фрагменту кода
  5. Сохраните фрагмент (в вашем контроллере)

Пример метода для размещения в вашей модели фрагмента

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?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top