Wenn ich einen Teil wiedergebe, der nicht existiert, erhalte ich eine Ausnahme. Ich möchte vor dem Rendern überprüfen, ob ein Teil vorhanden ist, und falls er nicht vorhanden ist, werde ich etwas anderes rendern. Ich habe den folgenden Code in meiner .erb-Datei geschrieben, aber ich denke, es sollte einen besseren Weg geben, dies zu tun:
<% begin %>
<%= render :partial => "#{dynamic_partial}" %>
<% rescue ActionView::MissingTemplate %>
Can't show this data!
<% end %>
ruby-on-rails
partial
Daniel Cukier
quelle
quelle
rescue
wird , ist riskant. Ich würde mir die anderen Lösungen ansehen, bevor ich sie verwende.Antworten:
Derzeit verwende ich in meinen Rails 3 / 3.1-Projekten Folgendes:
Der Vorteil gegenüber anderen Lösungen, die ich gesehen habe, ist, dass dies in allen Ansichtspfaden angezeigt wird und nicht nur in Ihrem Rails-Root. Das ist mir wichtig, da ich viele Schienenmotoren habe.
Dies funktioniert auch in Rails 4.
quelle
lookup_context.exists?("find", lookup_context.prefixes, true)
. Auf diese Weise müssen Sie das Ansichtsverzeichnis nicht fest in den Aufruf codieren. Beachten Sie, dass dies für Teiltöne gilt. Lassen Sie für Nicht-Partials das letzte Argument weg (oder verwenden Sie false anstelle von true)Ich hatte auch damit zu kämpfen. Dies ist die Methode, die ich letztendlich angewendet habe:
Grundsätzlich tun Sie nichts, wenn der Teil nicht existiert. Wollten Sie etwas drucken, wenn der Teil fehlt?
Edit 1: Oh, ich kann das Leseverständnis nicht verstehen. Sie haben gesagt, dass Sie etwas anderes rendern möchten. Wie wäre es in diesem Fall damit?
oder
Bearbeiten 2:
Alternative: Überprüfung der Existenz der Teildatei:
quelle
rescue nil
und... rescue ...
Methoden ausblenden. Das führt zu Fehlern, die schwer zu debuggen sind.In einer Ansicht existiert template_exists? funktioniert, aber die aufrufende Konvention funktioniert nicht mit der einzelnen Teilnamen-Zeichenfolge, sondern erfordert template_exists? (Name, Präfix, Teil)
So überprüfen Sie den Pfad teilweise: app / views / posts / _form.html.slim
Verwenden:
quelle
Wenn Sie sich in Rails 3.2.13 in einem Controller befinden, können Sie Folgendes verwenden:
template_exists?
wird delegiert anlookupcontext
, wie Sie in sehen könnenAbstractController::ViewPaths
_prefixes
gibt den Kontext der Vererbungskette des Controllers an.true
weil Sie nach einem Teil suchen (Sie können dieses Argument weglassen, wenn Sie eine reguläre Vorlage möchten).http://api.rubyonrails.org/classes/ActionView/LookupContext/ViewPaths.html#method-i-template_exists-3F
quelle
lookup_context.template_exists?("navbar", controller._prefixes, :partial)
. Dies sagt mir, ob die aktuelle Vorlage, die dieses Layout rendert, die angegebene "Navigationsleiste" teilweise hat, und wenn ja, kann ich sie rendern. Ich gehe:partial
nur, um explizit zu:partial
sagen, was dieser Boolesche Wert ist - ist wahr. Danke für das_prefixes
bisschen, @Flackou!_prefixes
durch,nil
wenn Sie einen Teil aufrufen, der sich in einem anderen übergeordneten Verzeichnis befindet.Ich weiß, dass dies beantwortet wurde und eine Million Jahre alt ist, aber so habe ich es für mich behoben ...
Schienen 4.2
Zuerst habe ich dies in meine application_helper.rb eingefügt
und jetzt anstatt anzurufen
<%= render "#{dynamic_path}" if lookup_context.find_all("#{dynamic_path}",[],true).any? %>
Ich rufe einfach an
<%= render_if_exists "#{dynamic_path}" %>
hoffentlich hilft das. (habe es nicht in Rails3 versucht)
quelle
def render_if_exists(*args); render(*args) if ...
für dieseIch habe dieses Paradigma bei vielen Gelegenheiten mit großem Erfolg verwendet:
Der Vorteil des obigen Codes besteht darin, dass wir zwei spezielle Fälle behandeln können:
Wenn wir nur den Code
<%= render :partial => "#{dynamic_partial}" rescue nil %>
oder eine Ableitung verwenden, kann der Teil existieren, aber eine Ausnahme auslösen, die stillschweigend gegessen wird und zu einer Schmerzquelle beim Debuggen wird.quelle
Was ist mit deinem eigenen Helfer:
quelle