【问题标题】:Ruby on rails. Add facebook.com/ to URL if not present红宝石在铁轨上。将 facebook.com/ 添加到 URL(如果不存在)
【发布时间】:2016-04-27 11:54:39
【问题描述】:

我的用户可以选择将他们的网站、Facebook 和 twitter URL 添加到他们的个人资料中。

我想让他们输入完整的 URL (http://www.facebook.com/USERNAME) 或 URL 的一部分,例如。 www.facebook.com/USERNAME 或只是USERNAME,然后在需要时自动添加https://facebook.com/。我想要 http://,然后输入的 URL 将直接链接到他们的网站/facebook 等。

对于我拥有的网站 URL:

before_validation :add_url_protocol

def add_url_protocol
  if self.website && !url_protocol_present?
    self.website = "http://#{self.website}"
  end
end

def url_protocol_present?
  self.website[/\Ahttp:\/\//] || self.website[/\Ahttps:\/\//]
end

然后有进一步的正则表达式验证。 这很好用。

问题是我对正则表达式没有太多了解,我不确定如何将 facebook.com/ 部分添加到此 before_validation 代码中。

任何帮助将不胜感激,谢谢。

更新:

def add_url_protocol
  if self.website && !url_protocol_present?
    self.website = "http://#{self.website}"
  end
  if self.facebook && !url_facebook_present?
    self.facebook = "http://facebook.com/#{self.facebook}"
  end
end

这几乎可行。如果用户输入USERNAME,则输出良好。如果用户输入 www.facebook.com/USERNAME 则输出变为http://facebook.com/www.facebook.com/USERNAME

【问题讨论】:

  • 你为什么混淆了:self.website = "http://facebook.com/#{self.username}"
  • 差不多,但是如果用户输入 www.facebook.com/USERNAME ,输出变为facebook.com/www.facebook.com/USERNAME

标签: ruby-on-rails regex validation


【解决方案1】:

最好的方法是在表单模型中收集用户输入,您可以通过包含ActiveModel::Model 或使用Reform 之类的东西来滚动自己。 您可以做的最简单的事情就是将他们的输入视为一个字符串,其中包含他们的 Facebook 用户名,以“/”分隔,因此无论他们输入什么字符串,您都可以通过

"https://www.facebook.com/their.username".split('/')[-1] # 'their.username'
"www.facebook.com/their.username".split('/')[-1] # 'their.username'

"their.username".split('/')[-1] # 'their.username'

只需在表单模型中声明一个用户名属性并覆盖 setter 即可提取 facebook 用户名。然后只在你的数据库中保存facebook用户名,写一个方法比如

def facebook_profile_url
   "www.facebook.com/#{fb_username}"
end

无需保留多余的 facebook url 部分。

【讨论】:

  • .split('/')[-1] 似乎运作良好。我对输入进行了正则表达式验证,因此在此之前,我创建了一个变量 fb_username = self.facebook..split('/')[-1] 。验证后,我将完整的 URL 放在新变量的前面并将其保存为 self.facebook
【解决方案2】:

我会试试的

match = /^(https?:\/\/)?((www\.)?facebook\.com)?(.*)/.match(self.website)
self.website = match[1] || 'http://'
self.website << match[2] || 'facebook.com'
self.website << match[3]

您可以使用括号创建捕获组。这 ?表示该 group 或 char 在它之前是可选的(所以我能够压缩您的协议搜索)

您可能需要将我的索引检查到匹配数组中...

抱歉,这是未经测试的,因为它来自手机...

【讨论】:

    猜你喜欢
    • 2011-07-13
    • 1970-01-01
    • 2016-01-07
    • 1970-01-01
    • 2016-03-21
    • 1970-01-01
    • 2014-10-08
    • 1970-01-01
    • 2017-03-26
    相关资源
    最近更新 更多