Byłem złym dzieckiem i użyłem następującej składni w moich szablonach częściowych, aby ustawić wartości domyślne zmiennych lokalnych, jeśli wartość nie została wyraźnie zdefiniowana w haszu: locals podczas renderowania częściowego -
<% foo = default_value unless (defined? foo) %>
Wydawało się, że działa to dobrze do niedawna, kiedy (bez żadnego powodu mogłem rozpoznać) nieprzekazane zmienne zaczęły zachowywać się tak, jakby zostały zdefiniowane jako zero (a nie niezdefiniowane).
Jak zauważyły różne pomocne osoby na SO, http://api.rubyonrails.org/classes/ActionView/Base.html mówi, aby nie używać
defined? foo
i zamiast tego użyć
local_assigns.has_key? :foo
Próbuję zmienić swoje sposoby, ale to oznacza zmianę wielu szablonów.
Czy mogę / powinienem po prostu pobierać opłaty z wyprzedzeniem i wprowadzać zmiany we wszystkich szablonach? Czy jest jakaś podstępność, na którą muszę uważać? Jak pilnie muszę testować każdy z nich?
źródło
local_assigns.fetch
doskonale obsługuje nawet klucze o zerowej wartości. Zwraca wartość domyślną tylko wtedy, gdy klucz nie jest w ogóle ustawiony.Ponieważ
local_assigns
jest to skrót, możesz również użyć opcji pobierania z opcjądefault_value
.Zwróci to,
default_value
jeślifoo
nie zostało ustawione.OSTRZEŻENIE:
Uważaj,
local_assigns.fetch :foo, default_value
kiedydefault_value
jest metoda, ponieważ i tak zostanie wywołana w celu przekazania jej wynikufetch
.Jeśli masz
default_value
metodę, możesz owinąć ją w blok:local_assigns.fetch(:foo) { default_value }
aby zapobiec jego wywołaniu, gdy nie jest potrzebne.źródło
nil
wartości są tutaj zachowane. Jeśli skrót zawiera:foo
zmapowanenil
,fetch
to zwrócinil
. To znaczy przynajmniej na mojej wersji 1.9.3. Nie pamiętam, jak zachowało się 1.8.local_assigns[:foo] || default_value
gdy foo zwróci wartość falsy,default_value
zostanie użyte zamiast tego. Zazwyczaj jest to problem dla Memoization,@some_value ||= expensive_method
jeśli metoda zwraca wartość falsy, zawsze zostanie wykonana.foo ||= local_assigns[:foo] = local_assigns.fetch(:foo, default_value)
foo = local_assigns.fetch :foo, true
Co powiesz na
Mówi to: „użyj,
foo
jeśli nie jest to zero lub prawda. W przeciwnym razie przypiszdefault_value
do foo”źródło
foo
jest to wartość logiczna. Może słusznie mieć wartośćfalse
i zostać przypadkowo zastąpionadefault_value
.Myślę, że należy to powtórzyć tutaj (z http://api.rubyonrails.org/classes/ActionView/Base.html ):
Jeśli chcesz dowiedzieć się, czy określonej zmiennej lokalnej została przypisana wartość w konkretnym wywołaniu renderowania, musisz użyć następującego wzorca:
Testujesz używając zdefiniowanego? nagłówek nie będzie działać. Jest to ograniczenie implementacji.
źródło
W moim przypadku używam:
w mojej częściowej.
Nie mam pojęcia, czy to dobrze, ale dla mnie jest OK
źródło
nil
jako lokalny w częściowym wywołaniu.variable
jest to wartość logiczna i trzeba ją ustawić nafalse
. Użyje wartości domyślnej zamiastfalse
wartości. KORZYSTAJ NA WŁASNE RYZYKO.Wiem, że to stary wątek, ale tutaj jest mój mały wkład: chciałbym użyć
local_assigns[:foo].presence
w warunkowego wewnątrz częściowe. Następnie ustawiamfoo
tylko w razie potrzeby w wywołaniu renderowania:Zobacz oficjalny przewodnik po Railsach tutaj . Obowiązuje z RoR 3.1.0.
źródło
local_assigns[:foo]
ilocal_assigns[:foo].presence
. Albo jeden zwróci,nil
jeśli klucz nie istnieje w haszu, a wartość, jeśli istnieje.Myślę, że lepsza opcja, która pozwala na wiele zmiennych domyślnych:
źródło
Jest to pochodna odpowiedzi Pabla. To pozwala mi ustawić wartość domyślną („pełny”), a na koniec „tryb” jest ustawiony zarówno w local_assigns, jak i w rzeczywistej zmiennej lokalnej.
haml / slim:
erb:
źródło
Bardziej intuicyjny i kompaktowy:
<% some_local = default_value unless local_assigns[:some_local] %>
źródło
:locals => {:some_local => false}
Jeśli nie chcesz przekazywać zmiennej lokalnej na częściową za każdym razem, gdy ją wywołujesz, wykonaj następujące czynności:
W ten sposób unikniesz
undefined variable
błędu. Umożliwi to wywołanie częściowe z / bez zmiennych lokalnych.źródło
Ruby 2.5
Erb
Jest to możliwe, ale musisz zadeklarować wartości domyślne w zakresie.
ZMIENNE słowo na wymianę.
źródło
Pomocnika można utworzyć tak, aby wyglądał następująco:
Wdrożony jak:
Zobacz mojego bloga aby dowiedzieć się, jak i dlaczego.
Zauważ, że to rozwiązanie pozwala przekazać wartość zero lub fałsz jako wartość bez przesłonięcia.
źródło