2016-09-08 5 views
1

Ruby on Rails: von URL Ich möchte einen bestimmten Wert erhalten, für den ich überprüfe, ob die URL diesen Wert enthält oder kein Array verwendet. Wenn es diesen Wert hat, teile ich die URL und gebe den Wert zurück.Wie kann ich die Leistung dieses Loops komprimieren und steigern?

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg' 

['apple','banana','grape','butter','honey'].each do |fruit| 
    if (@url.include? fruit) 
    return @url.split(fruit)[1].freeze 
    end 
end 

i Schleife wollen nicht 5 mal .. ist Frage, wie kann ich diese Schleife komprimieren kann.

+0

Sie können nur 'return' von einem Verfahren. Außerdem, was ist dein erwartetes Ergebnis? – Stefan

+0

"w740_h550_q58.jpg" Dieser Wert, den ich zurückgeben möchte – Harsha

Antwort

3

Sie einen regulären Ausdruck String#split passieren könnte:

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg' 

@url.split(/apple|banana|grape|butter|honey/)[1] 
#=> "-w740_h550_q58.jpg" 

Oder mit String#[]:

@url[/(apple|banana|grape|butter|honey)(.*)/, 2] 
#=> "-w740_h550_q58.jpg" 

Oder ein positive lookbehind mit dem zweiten Argument zu vermeiden: (Hut Spitze zu mudasobwa)

@url[/(?<=apple|banana|grape|butter|honey).*/] 
#=> "-w740_h550_q58.jpg" 
+0

Regex arbeitet viel schneller als jede Schleife mit Attributen in Array. Dies sollte eine Antwort sein. – Ilya

+1

Oder, ohne hässliches ', 2':' @url [/ (? <= Apfel | Banane | Traube | Butter | Honig]. * /] '. – mudasobwa

2

versuchen Sie dies:

url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg' 

['apple','banana','grape','butter','honey'].select { |f| url.include? f } 
1

Dieser sollte funktionieren:

@url = 'http://fruits.com/A15/abc1234-apple-w740_h550_q58.jpg' 

def last_part_of_url 
    fruit = ['apple','banana','grape','butter','honey'].detect { |f| @url.include?(f) } 
    @url.split(fruit).last if fruit 
end 
Verwandte Themen