3

我正在开发一个应用程序,我遇到了以下代码。

我有一组链接,其中包含用户在表单中发布的一些链接。比如说我的数组是bunch1 = ["google.com","http://yahoo.com"]

现在,在将它们存储到数据库之前,我需要确保每个链接的开头都添加了“http://”,因为我的 ActiveRecord 对象中有“验证:”逻辑。

所以我的逻辑是我将遍历数组并检查数组中每个链接之前是否存在“http://”字符串段。很明显,我必须在数组中的“google.com”之前添加“http://”字符串段。

所以我写了这样的代码:

bunch2=bunch1.map { |y| y="http://"+y }

但它会创建一个像 bundle2=["http://google.com","http://http://yahoo.com"] 这样的 bundle2 数组

如您所见,它在 "http://yahoo.com" 之前添加了一个额外的 "http://" 。

为了解决这个问题,我修改了上面的代码,如下所示:

bunch2 = bunch1.select { |x|  x !~ /http/ }.map { |y| y="http://"+y }

但它会生成一个类似 bunch2 = ["http://google.com"] 的数组,因为带有 select 方法的正则表达式正在消除 yahoo.com

有人可以给我解决这个问题。提前致谢...

4

2 回答 2

5

为什么不在调用中测试map呢?

bunch2 = bunch1.map {|y| y !~ /^http/ ? "http://#{y}" : y }

于 2013-01-03T16:19:15.770 回答
0

好的,伙计们,我已经找到了解决这个问题的方法。所以代码根本不需要 select 方法。它只需要一个三元运算符。所以我的一个班轮代码是这样的: -

@bunch2=@bunch1.map { |x| x.match(/http:/) ? x : "http://"+x }

上面的代码使用 match 方法与正则表达式进行匹配。如果找到匹配项,则元素不变,否则在开头添加“httP://”字符串。

于 2013-01-04T08:33:51.443 回答