2017-11-13 14 views
0

Ich möchte einen Parameter auswählen, wenn es in einem Bereich von 1 bis 100.Rubin/Rails ternären und Bereich

-Controller fällt:

@range = search_range(params[:range]) 

Helper:

def search_range(range) 
    range = range.to_i 
    range == 1..100 ? range : 30 
end 

Aber es ist gibt immer 30 zurück ... versuchte viele Dinge und normal "if/else", wollte aber ternären Operator. Dank

+0

Was ist Ihre Frage? – mudasobwa

+0

Was gibt 'params [: range]' zurück? – Stefan

+0

Problem ist, dass search_range immer 30 zurückgibt ... –

Antwort

3

nur überprüfen wollen, ob params [: Bereich] ist zwischen 1..100. Wenn nicht zurück 30

Diese Arbeit sollte:

def search_range(range) 
    range = range.to_i 
    range.between?(1, 100) ? range : 30 
end 

Das Problem mit Ihrem Code ist, dass == Objekte vergleicht, das heißt:

20 == 1..100 
#=> false 

prüft, ob die ganze Zahl 20 ist (numerisch) gleich dem Bereich 1..100. Natürlich ist es nicht, 1..100 ist nicht einmal eine Nummer.

+0

Wollte eine ternäre Operation Lösung und gute Lesbarkeit Danke! –

+1

Ich habe einen schnellen Benchmark (siehe meine Antwort) zu diesen Optionen ausgeführt, und dies ist auch der schnellste Weg ... – SRack

0

Wenn Ihr params[:range] gibt eine Zahl zurück, ich glaube, Sie so etwas wie die folgenden benötigen:

def search_range(range) 
    range = range.to_i 
    range == (1..100).include?(range) ? range : 30 
end 

Ist das, was Sie meinen? I.E. Wenn die Variable 'range' innerhalb von 1 bis 100 liegt, gib sie zurück, sonst 30?

Update:

ich eine schnelle Benchmark über die Optionen auf der Seite getan haben, und between? kommt schnellste:

   user  system  total  real 
include? 0.230000 0.000000 0.230000 ( 0.239637) 
between? 0.130000 0.000000 0.130000 ( 0.129158) 
===  0.290000 0.000000 0.290000 ( 0.293817) 
+2

Oder eher '(1..100) === Bereich? Bereich: 30' –

+0

@Stefan: Wie ist dann der Standardwert '30' sinnvoll? :) –

+0

params [: range] ist eine ganze Zahl für eine kilometrische Entfernung. Wie 20. Aber search_range immer 30 –