如何在 Rails 中将 http 前缀到用户输入的多列 url 中?



这个问题已经回答了单列的问题,但是你如何为多列做到这一点?我有三列(网站,fb,twitter),我想用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

问题是

link = "http://" + link

在代码中,为块中的 link 变量分配一个新值,但不更改列表的相应元素。

要就地更改列表的元素,您可以使用Array#map!

links.map! do |link|
  link.include?("http://") || link.include?("https://") ? link : "http://" + link
end

我有点担心的另一件事是,即使给定的子字符串(例如,'http://'出现在字符串中间的某个地方,而不一定在开头,include?也会返回 true。我宁愿为该任务使用正则表达式:

links.map! { |link| link =~ %r{Ahttps?://} ? link : "http://" + link }

更新

如果link是模型的属性,那么至少应该将其存储为属性,而不是局部links变量:

self.links = links.map { |link| link =~ %r{Ahttps?://} ? link : "http://" + link }

最新更新