2016-07-21 11 views
0

Ich bekomme Arrays von verschiedenen URLs aus einer Datenbankspalte. Beide werden verwendet, um eine Whitelist auf eine URL anzuwenden (zB www.example.com/test/page.html). Einer ist für den URL-Anfang, einer für das Ende.Rails: keine implizite Umwandlung von Nil in String

whitelist_start = self.domain.whitelists.map(&:url_start) 
whitelist_end = self.domain.whitelists.map(&:url_end) 

Bevor ich meine URL in der Datenbank einzufügen, möchte ich überprüfen, ob save_url wahr ist. Danach wird die gefilterte URL eingefügt. Die URL kann starten (zB www.example.com/test) oder mit einer URL enden (zB page.html). Die gesamte Whitelist kann aber auch gleichzeitig leer sein. Eines dieser drei Dinge.

save_url = url.starts_with?(*whitelist_start) || url.ends_with?(*whitelist_end) || whitelist_start.empty? || whitelist_end.empty? 

Ich verwende das * vor dem Array-Namen in Starts_with? und endet mit? weil ich dort alle Array-Werte einfügen möchte. Wenn jedoch ein Array leer ist (was völlig in Ordnung ist), erhalte ich diesen Fehler und kann nicht fortfahren.

no implicit conversion of nil into String 

Gibt es eine Möglichkeit, dies zu lösen?

Antwort

4

Es auftreten, weil Sie eine Null-Position auf dem Arrays haben, versuchen Sie diese

whitelist_start = self.domain.whitelists.map(&:url_start).compact 
whitelist_end = self.domain.whitelists.map(&:url_end).compact 

ich Ihnen zeigen, ist das Array nicht leer

2.3.1 :017 > test = [] 
=> []  
2.3.1 :019 > "string".starts_with?(*test) 
=> false 

Und jetzt Ihre nil Feldposition

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

In meinen Tests tritt dieser Fehler nur auf, wenn nil ist in der ersten Position

+0

Ich lag falsch, sorry dafür. Down geht auf :) – mudasobwa

+0

Entspannen, es war nichts .. Danke;) – rneves