Делать что-то перед сохранением формы, используемой с HABTM - PullRequest
0 голосов
/ 19 ноября 2009

У меня сейчас 3 таблицы.

сниппет теги snippet_tags

Я использую HABTM.

Итак, я создал форму для сохранения фрагмента с тегами. Ключевые слова в текстовом поле, разделенные запятыми.

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

Я пробовал с before_save, но, похоже, это не так ..

Так что, если бы вы могли мне помочь, было бы здорово!

Большое спасибо!

Ответы [ 4 ]

2 голосов
/ 19 ноября 2009

Вот версия вашего create метода. Основным изменением не является создание Snippet_Tag. Если ваша ассоциация HABTM настроена правильно, то в вашем фрагменте будет коллекция тегов, в которую вы можете добавить свои теги. Коллекция будет сохранена как Snippet_Tag s 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
2 голосов
/ 19 ноября 2009

Я думаю, что ответ Джозефа довольно хорош. Хотя я бы сделал все это в действии 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.

Обратите внимание, что я только что предположил, как называются ваши переменные и параметры.

1 голос
/ 19 ноября 2009
  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
0 голосов
/ 19 ноября 2009

Попробуйте before_update?

...