Ruby on rails。如果不存在,请将facebook.com/添加到URL

时间:2016-04-27 11:54:40

标签: ruby-on-rails regex validation

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

我想让他们输入完整的网址(http://www.facebook.com/ USERNAME)或部分网址例如。 www.facebook.com/USERNAME或仅USERNAME,然后根据需要自动添加https://facebook.com/。我想要http://,因为输入的URL将直接链接到他们的网站/ Facebook等。

对于我的网站网址:

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

2 个答案:

答案 0 :(得分: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网址部分。

答案 1 :(得分:0)

我会尝试

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是可选的(所以我能够压缩你的协议搜索)

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

对不起,这是未经测试的,因为它来自手机...