我的用户可以选择将他们的网站,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
答案 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是可选的(所以我能够压缩你的协议搜索)
您可能需要将我的索引检查到匹配数组...
对不起,这是未经测试的,因为它来自手机...