Rails:没有将 nil 隐式转换为 String

GoY*_*shi 3 ruby arrays string null ruby-on-rails

我从数据库列中获取不同 url 的数组。两者都用于在 url 上应用白名单(例如 www.example.com/test/page.html)。一个用于 url 开头,一个用于结尾。

whitelist_start = self.domain.whitelists.map(&:url_start)
whitelist_end   = self.domain.whitelists.map(&:url_end)
Run Code Online (Sandbox Code Playgroud)

在将我的 url 插入数据库之前,我想检查 save_url 是否为真。之后,将插入过滤后的 url。网址可以以以太开头(例如 www.example.com/test)或以网址结尾(例如 page.html)。但是整个白名单也可以同时为空。这三件事之一。

save_url   = url.starts_with?(*whitelist_start) || url.ends_with?(*whitelist_end) || whitelist_start.empty? || whitelist_end.empty?
Run Code Online (Sandbox Code Playgroud)

我在starts_with 中的数组名称之前使用*?和ends_with?因为我想在那里插入所有数组值。但是,如果一个数组为空(这完全没问题),我会收到此错误并且无法继续。

no implicit conversion of nil into String
Run Code Online (Sandbox Code Playgroud)

有没有办法解决这个问题?

rne*_*ves 6

发生这种情况是因为您的阵列上有一个 nil 位置,试试这个

whitelist_start = self.domain.whitelists.map(&:url_start).compact
whitelist_end   = self.domain.whitelists.map(&:url_end).compact
Run Code Online (Sandbox Code Playgroud)

我会告诉你,你的数组不是空的

2.3.1 :017 > test = []
 => []     
2.3.1 :019 > "string".starts_with?(*test)
 => false 
Run Code Online (Sandbox Code Playgroud)

现在,你的nil阵列位置

2.3.1 :020 > test = [nil]
 => [nil] 
2.3.1 :021 > "string".starts_with?(*test)
TypeError: no implicit conversion of nil into String
Run Code Online (Sandbox Code Playgroud)

在我的测试中,此错误仅在nil处于第一个位置时发生