2010-09-02 13 views
11

Często piszę kod, aby podać wartość domyślną po napotkaniu zerowej/pustej wartości.Czy w szynach wbudowano obsługę domyślnego idiomu zastępowania wartości?

Np:

category = order.category || "Any" 
# OR 
category = order.category.empty? ? "Any" : order.category 

Mam zamiar rozszerzyć metodę try do obsługi tego idiomu.

category = order.try(:category, :on_nill => "Any") 
# OR 
category = order.try(:category, :on_empty=> "Any") 

Zastanawiam się, czy Rails/Ruby ma jakiś sposób obsługi tego idiomu?

Uwaga:

staram się wyeliminować powtórzenia idiomów opartych ||/or/? operatora.

Zasadniczo szukam odpowiednika metody try do obsługi domyślnych scenariuszy zastępowania.

Bez try metoda:

product_id = user.orders.first.product_id unless user.orders.first.nil? 

Z try metoda:

product_id = user.orders.first.try(:product_id) 

Jest łatwy do wdrożenia rodzajowe podejście do obsługi tego idiomu, ale chcę, aby upewnić się, że nie narastającymi koło.

Odpowiedz

12

Zobacz this question. ActiveSupport dodaje metodę presence do wszystkich obiektów, które zwracają jej odbiornik, jeśli present? (przeciwieństwo) i nil w przeciwnym razie.

przykład:

host = config[:host].presence || 'localhost' 
+0

Super fajna odpowiedź! – kamal

1

Być może to służyć:

class Object 
    def subst_if(condition, replacement) 
    condition = send(condition) if condition.respond_to?(:to_sym) 
    if condition 
     replacement 
    else 
     self 
    end 
    end 
end 

Używane tak:

p ''.subst_if(:empty?, 'empty')  # => "empty" 
p 'foo'.subst_if(:empty?, 'empty') # => "foo" 

bierze również samodzielne warunki nie związane z obiektem:

p 'foo'.subst_if(false, 'bar') # => 'foo' 
p 'bar'.subst_if(true, 'bar') # => 'bar' 

I Nie zwariowałem na punkcie subst_if. Wypożyczyłabym dowolne imię, które Lisp używa dla tej funkcji, jeśli wiedziałem o tym (zakładając, że istnieje).

+0

+1, jest interesująca podejścia. Myślałem o rozszerzeniu metody "try", ponieważ używam jej już w wielu miejscach. –

0

Na pewno nie jest upieczony. Oto link do similar question/answer. Jest to podejście, które podejmuję. Wykorzystując Ruby ||= składni

na marginesie: To pytanie również przypomina mi pierwsze Railscasts wszechczasów: Caching with instance variables która jest przydatna screencast jeśli trzeba zrobić tego rodzaju operacji w kontroler

Powiązane problemy