【问题标题】:Trying to set a list of hashtags in my tags table尝试在我的标签表中设置主题标签列表
【发布时间】:2013-10-02 19:26:35
【问题描述】:

假设用户输入 -> #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 一样好用。 非常感谢。

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 hashtag


    【解决方案1】:

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

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

    更认真:

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

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

    要使所有字符小写,只需:

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

    【讨论】:

    • 该死!我真的需要学习这个正则表达式的东西。谢谢!我现在就试试看。
    • 增加了精度,输出必须被展平,因为捕获组产生数组。如果你想练习正则表达式,我推荐rubular 亲自动手,显然,阅读Regexp API page
    • 像梦想一样工作。谢谢!
    • 也感谢您提供的链接,需要在正则表达式上升级我的游戏。
    【解决方案2】:
    names.strip.split("#").compact.each do |tag|
      tags << Tag.where(name: tag).first_or_create!
    end
    

    【讨论】:

      猜你喜欢
      • 2021-04-23
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2016-07-25
      • 1970-01-01
      • 2015-01-13
      • 2014-02-22
      相关资源
      最近更新 更多