此question已针对单个列回答了问题,但您如何为多个列执行此操作?我有三个列(网站,fb,推特),我希望用http作为前缀,以防用户不在表格中输入。
我尝试了这个,但它不起作用:
before_save :sanitize_links
private
def sanitize_links
website = self.website
facebook = self.facebook
twitter = self.twitter
links = [website, facebook, twitter]
links.each do |link|
unless link.include?("http://") || link.include?("https://")
link = "http://" + link
end
end
end
更新
我已经尝试过KL-7的建议,但不幸的是遇到了一些障碍。如何使用before_save
的数组输出?我已经尝试过以下代码,但它不起作用。
before_save :sanitize_links
private
def sanitize_links
links = ["website", "facebook", "twitter"]
links.map! { |link| self.link =~ %r{\Ahttps?://} ? self.link : "http://" + self.link }
end
更新2
我放弃了。我将重复三次:
before_save :sanitize_links
private
def sanitize_links # prefix user-submitted links with http:// if missing
self.website =~ %r{\Ahttps?://} ? self.website : self.website = "http://" + self.website
self.facebook =~ %r{\Ahttps?://} ? self.facebook : self.facebook = "http://" + self.facebook
self.twitter =~ %r{\Ahttps?://} ? self.twitter : self.twitter = "http://" + self.twitter
end
答案 0 :(得分:1)
问题在于
link = "http://" + link
代码中的使用块为link
变量赋值,但不会更改列表的相应元素。
要在原地更改列表元素,您可以使用Array#map!
:
links.map! do |link|
link.include?("http://") || link.include?("https://") ? link : "http://" + link
end
我有点担心的另一件事是include?
将返回true,即使给定的子字符串(例如'http://'
出现在字符串中间某处而不一定在开头。我宁愿使用正则表达式执行该任务:
links.map! { |link| link =~ %r{\Ahttps?://} ? link : "http://" + link }
<强>更新强>
如果link
是您模型的属性,那么您至少应该将其存储为属性而不是本地links
变量:
self.links = links.map { |link| link =~ %r{\Ahttps?://} ? link : "http://" + link }