Kiedy renderuję fragment, który nie istnieje, otrzymuję wyjątek. Chciałbym sprawdzić, czy podrzędny istnieje przed renderowaniem, a jeśli nie istnieje, wyrenderuję coś innego. Zrobiłem następujący kod w moim pliku .erb, ale myślę, że powinien być lepszy sposób na zrobienie tego:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Daniel Cukier
źródło
źródło
rescue
jest ryzykowna. Przed użyciem przyjrzałbym się innym rozwiązaniom.Odpowiedzi:
Obecnie w moich projektach Rails 3 / 3.1 używam:
Zaletą nad innymi rozwiązaniami, które widziałem, jest to, że będzie to wyglądać we wszystkich ścieżkach widoku, a nie tylko w katalogu głównym rails. Jest to dla mnie ważne, ponieważ mam wiele silników szynowych.
Działa to również w Rails 4.
źródło
lookup_context.exists?("find", lookup_context.prefixes, true)
. W ten sposób nie musisz na stałe kodować katalogu widoku w wywołaniu. Uwaga, to dotyczy częściowych. W przypadku nie częściowych pomiń ostatni argument (lub użyj fałszu zamiast prawdy)Ja też się z tym zmagałem. Oto metoda, którą ostatecznie użyłem:
Zasadniczo, jeśli nie ma częściowej, nic nie rób. Czy chciałeś coś wydrukować, jeśli brakuje fragmentu?
Edycja 1: Och, nie czytam ze zrozumieniem. Powiedziałeś, że chciałeś wyrenderować coś innego. W takim razie co powiesz na to?
lub
Edycja 2:
Alternatywa: sprawdzanie istnienia pliku częściowego:
źródło
rescue nil
i... rescue ...
metody będą go ukryć. Prowadzi to do błędów, które są trudne do debugowania.W widoku, template_exists? działa, ale konwencja wywoływania nie działa z pojedynczym ciągiem częściowej nazwy, zamiast tego przyjmuje template_exists? (nazwa, prefiks, częściowa)
Aby sprawdzić, czy ścieżka jest częściowa: app / views / posts / _form.html.slim
Posługiwać się:
źródło
W Railsach 3.2.13, jeśli jesteś w kontrolerze, możesz użyć tego:
template_exists?
jest delegowanylookupcontext
, jak widać wAbstractController::ViewPaths
_prefixes
podaje kontekst łańcucha dziedziczenia administratora.true
ponieważ szukasz częściowej (możesz pominąć ten argument, jeśli potrzebujesz zwykłego szablonu).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
źródło
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. To mówi mi, czy bieżący szablon renderujący ten układ ma określony "pasek nawigacyjny" częściowy, a jeśli tak, mogę go wyrenderować. Przechodzę:partial
tylko po to, aby wyraźnie powiedzieć, czym jest ta wartość logiczna -:partial
jest prawdą. Dzięki za_prefixes
trochę, @Flackou!_prefixes
sięnil
jeśli dzwonisz częściowy to w innym katalogu nadrzędnego.Wiem, że odpowiedź na to pytanie ma milion lat, ale oto jak to dla mnie naprawiłem ...
Szyny 4.2
Najpierw umieściłem to w pliku application_helper.rb
a teraz zamiast dzwonić
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
po prostu dzwonię
<%= render_if_exists "#{dynamic_path}" %>
mam nadzieję, że to pomoże. (nie próbowałem w rails3)
źródło
def render_if_exists(*args); render(*args) if ...
do tego użyćWielokrotnie korzystałem z tego paradygmatu z wielkim sukcesem:
Zaletą powyższego kodu jest to, że możemy obsłużyć określone przypadki:
Jeśli użyjemy tylko kodu
<%= render :partial => "#{dynamic_partial}" rescue nil %>
lub jakiejś pochodnej, część może istnieć, ale zgłosi wyjątek, który zostanie po cichu zjedzony i stanie się źródłem bólu podczas debugowania.źródło
A co z twoim własnym pomocnikiem:
źródło