0

假设用户输入-> #ruby #rails #flight
我正在尝试拆分主题标签列表并将其设置在我的标签表中,前提是该标签尚未在表中。

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

问题是它将空值设置为第一个标签。
如何将所有主题标签设为小写,以及如何使其忽略空格,以便 #cake#bake 与 #cake #bake 一样好用。非常感谢。

4

2 回答 2

3

正则表达式的力量,拯救!(提示英雄姿势)

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

更严重的是:

  • String#scan查找字符串中正则表达式的所有匹配项,并返回一个数组
  • 在正则表达式中,我们有:
    • 匹配#字符,
    • 打开一个捕获组(这就是我们有一个数组数组的原因),
    • 匹配一个或多个既不是#也不是空格的字符,
    • 关闭捕获组。

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

要使所有字符小写,只需执行以下操作:

"#ruby #rail­s #flig­ht".scan( /#(\w+)/ ).flatten.map( &:downcase )
于 2013-09-26T17:40:08.683 回答
0
names.strip.split("#").compact.each do |tag|
  tags << Tag.where(name: tag).first_or_create!
end
于 2013-09-26T17:49:43.470 回答