2016-04-25 5 views
1

Спасибо за помощь! Я пытаюсь сохранить твиттер, как хэштеги в моем приложении rails. Пользователи вводят свои теги, добавленные символом #hashtag. Тем не менее, он сохраняет сохранение пустых строк. Я добавил дополнительную информацию, кроме инструкции для борьбы с ней, но теперь она не сохраняет никаких тегов. Код:Сохранение Twitter Like Hashtags с Rails

def tag_list=(names) 
    self.tags = names.split(/\B#\w+/).map do |n| 
    unless n.strip == "" || n.strip == nil 
     Tag.where(name: n.strip).first_or_create! 
    end 
    end 
end 

Я также попытался следующее регулярное выражение, которое также возвращать тот же:

/\B#\w+/ 

/(?:^|\s)(?:(?:#\d+?)|(#\w+?))\s/i 

/(?:\s|^)(?:#(?!\d+(?:\s|$)))(\w+)(?=\s|$)/i 
+0

['String # scan'] (http://ruby-doc.org/core-2.3.0/String.html#method-i-scan) может быть более подходящим инструментом для этого, чем [' String # split'] (http://ruby-doc.org/core-2.3.0/String.h TML # метод-я-сплит). Вы на самом деле не пытаетесь * разбить * строку на куски, вы пытаетесь * сканировать * строку, чтобы найти определенные шаблоны. –

ответ

1

Ваш первый регулярное выражение работает полностью, но вы должны использовать scan вместо split, поэтому ваш код Назначьте теги будут:

def tag_list=(names) 
    self.tags = names.scan(/\B#\w+/).map do |tag| 
    Tag.find_or_initialize_by(name: tag.remove('#')) 
    end 
    save! 
end 

изменения:

  • Использование scan
  • Используйте find_or_initialize_by вместо where затем first_or_create!
  • Использование save! в конце, чтобы сохранить один раз
  • Вам не нужно tag.remove('#'), если вы хотите сохранить хэштегом с # префиксом
+0

Спасибо Hieu Pham - Это прекрасно работает! – robinyapockets