如何在RS中为用户提供多个列的url输入前缀?

时间:2012-07-07 13:43:05

标签: ruby-on-rails-3 url link-to

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

1 个答案:

答案 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 }