2013-09-26 39 views
0

假设用户输入 - > #ruby #rails #flight
我想分割标签列表并将其设置在我的标记表中,只要标记isn已经在桌子上了。
尝试在我的标记表中设置#标签列表

def tag_list=(names) 
    self.tags = names.split("#").map do |n| 
     Tag.where(name: n.strip).first_or_create! 
    end 
end 

问题是它设置一个空值作为第一个标记。
我如何使所有hashtags小写字母,也如何使它忽略空间#蛋糕#烘烤作品以及#蛋糕#烘烤。 非常感谢。

回答

3

正则表达式的力量,来拯救! (线索英勇姿态)

>> "#ruby #rail­s #flig­ht".scan /#([^­#\s]+)/ 
=> [["ruby"],["rails"],["flight"]] 

更严重的是:

  • String#scan找到字符串的正则表达式的所有比赛,并返回正则表达式里的数组
  • ,我们有:
    • 匹配#字符,
    • 打开一个捕获组(这就是为什么我们有一个数组阵列),
    • 匹配一个或多个既不是#也不是空白的字符,
    • 关闭捕获组。

一个简单的版本可以是:/#(\w+)/,其中,匹配的字符是唯一的“字”字。

为小写使所有的字符,只是做:

"#ruby #rail­s #flig­ht".scan(/#(\w+)/).flatten.map(&:downcase) 
+0

该死!我真的需要学习这个正则表达式的东西。谢谢!我现在就试试看。 – Skyalchemist

+0

增加了精度,因为捕获组产生阵列,输出必须变平。如果你想练习正则表达式,我推荐[rubular](http://rubular.com/)亲自动手,显然,阅读[Regexp API页面](http://www.ruby-doc.org) /core-2.0.0/Regexp.html)。 –

+0

作为一个梦想工作。 Thanksss! – Skyalchemist

0
names.strip.split("#").compact.each do |tag| 
    tags << Tag.where(name: tag).first_or_create! 
end