2016-04-25 10 views
1

Vielen Dank für Ihre Hilfe! Ich versuche, Twitter wie Hashtags in meiner Rails App zu speichern. Benutzer geben ihre Tags ein, denen das Symbol #hashtag vorangestellt ist. Es speichert jedoch weiterhin leere Zeichenfolgen. Ich habe eine zusätzliche unless-Anweisung hinzugefügt, um es zu bekämpfen, aber jetzt speichert es keine Tags. Code:Speichern von Twitter wie Hashtags mit Regex-Schienen

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 

Ich habe auch versucht, die folgende Regex, die auch das gleiche zurück:

/\B#\w+/ 

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

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

speichern möchten ['String # scan'] (http://ruby-doc.org/core-2.3.0/String.html#method-i-scan) könnte hierfür ein geeigneteres Werkzeug sein als [' String # split'] (http://ruby-doc.org/core-2.3.0/String.h.) tml # Methode-i-split). Du versuchst nicht wirklich * die Zeichenfolge in Stücke zu teilen, du versuchst * die * Zeichenfolge zu scannen, um bestimmte Muster zu finden. –

Antwort

1

Ihre erste Regex funktioniert völlig, aber Sie müssen scan statt split, so dass Ihr Code verwenden, um zuweisen die Tags wäre:

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

die Änderungen sind:

  • Verwenden scan
  • Verwenden find_or_initialize_by statt where dann first_or_create!
  • Verwendung save! am Ende einmal
  • sparen Sie nicht tag.remove('#') benötigen, wenn Sie das Hashtag mit # Präfix
+0

Dank Hieu Pham - Das funktioniert perfekt! – robinyapockets