Rails: Sollten Partialtypen Instanzvariablen kennen?
Ryan Bates' nifty_scaffolding, zum Beispiel, bedeutet dies,
Bearbeiten.html-Code.erb
<%= render :partial => 'form' %>
neu.html-Code.erb
<%= render :partial => 'form' %>
_form.html-Code.erb
<%= form_for @some_object_defined_in_action %>
Dass ausgeblendeten Zustand macht mir ein unangenehmes Gefühl, so dass ich in der Regel, wie dies zu tun
Bearbeiten.html-Code.erb
<%= render :partial => 'form', :locals => { :object => @my_object } %>
_form.html-Code.erb
<%= form_for object %>
Also, was ist besser: a) die partials Zugriff auf Instanz-Variablen oder b) die übergabe einer teilweise alle Variablen, die es braucht?
Ich habe die Entscheidung für b) als der spät, aber ich habe laufen in eine kleine Gurke:
some_action.html-Code.erb
<% @dad.sons.each do |a_son| %>
<%= render :partial => 'partial', :locals => { :son => a_son } %>
<% end %>
_partial.html-Code.erb
The son's name is <%= son.name %>
The dad's name is <%= son.dad.name %>
Sohn.Papa macht eine Datenbank rufen Sie zum abrufen der Papa! Also ich würde entweder auf @dad, das würde gehen zurück zu a) die partials Zugriff auf Instanz-Variablen oder müsste ich pass @Papa einheimischen, ändern render :partial zu
<%= render :partial => 'teilweise', :locals => { :Vater => @Vater :Sohn => a_son } %>, und für einige Grund, vorbei an einer Reihe von vars für meine teilweise fühle ich mich unwohl. Vielleicht fühlen sich andere auch so.
Hoffentlich, dass machte Sinn. Auf der Suche nach einigen Einblick in diese ganze Sache... Danke!
InformationsquelleAutor der Frage Alexandre | 2010-03-23
Du musst angemeldet sein, um einen Kommentar abzugeben.
In den letzten Versionen von Rails ist es schon ein bisschen einfacher zum Rendern von partials und pass einheimischen zu Ihnen. Statt dieser.
Können Sie dies tun.
Aber ich mache das nicht in der Nifty-Scaffold-generator zu behalten, rückwärts-Kompatibilität, aber ich werde es ändern dies in einer zukünftigen Version.
Als ob es ist akzeptabel, verwenden Instanzvariablen in partials. Ich denke, es ist. Bei aller Zweckmäßigkeit, was ist der Nachteil? Sicherlich, die Dinge aus der hand, wenn Sie nicht konsistent sind, aber ich mag diese Richtlinien angewendet werden.
Nie erstellen Sie eine Instanz-variable einfach zu teilen, um es zwischen der Teiltöne. In der Regel bedeutet dies, dass Sie nur den Austausch der controller-Ressource-Objekt.
Wenn die teilweise den gleichen Namen wie die Ressource, übergeben Sie es als lokale mit
<%= render @item %>
.Wenn die teilweise gemeinsam genutzt werden, die über mehrere Controller verwenden Sie anschließend nur die einheimischen.
Dies ist, was funktioniert gut für mich sowieso.
Bonus-Tipp: wenn Sie finden, sich selbst vorbei in eine Menge von einheimischen, die in ein Teil-und Sie wollen einige von Ihnen sind optional, erstellen Sie eine helper-Methode, die macht die partielle. Dann immer gehen Sie durch die helper-Methode, so können Sie eine saubere Schnittstelle mit der optionalen Argumente für die Darstellung der partiellen.
InformationsquelleAutor der Antwort ryanb
Mit @instance_variables in der Teiltöne ist schlechtes design.
Verwendung von Instanzvariablen in partials funktioniert, aber es kann machen es schwieriger zu pflegen Anwendungen, wenn änderungen sind immer nötig.
Den Nachteil der Verwendung von Instanzvariablen in partials ist die Ausgabe, die Sie erstellen, eine Abhängigkeit, in die teilweise etwas außerhalb der teilweisen Umfang (Kupplung). Dies macht die teilweise schwieriger wiederzuverwenden, und kann die Kraft, die änderungen in mehreren teilen der Anwendung, wenn Sie eine änderung vornehmen möchten, die in einem Teil.
Teiltöne, die mit Instanz-Variablen:
Übergeben Sie stattdessen die einheimischen, die Teiltöne:
Nun, da die teilweise nur Verweise
item
und nicht@item
die Aktion, das macht die Ansicht, dass die macht der reusable_partial ist frei zu ändern, ohne die reusable_partial und die anderen Aktionen/Ansichten, Rendern:Außerdem kann dieser wiederverwendet werden, in Kontexten, in denen es keine @Element:
Wenn mein
@duck
Veränderungen in der Zukunft und nicht mehr quakt wie reusable_partial erwartet, dass es (das Objekt die interface-änderungen), kann ich auch einen adapter verwenden, um pass in die Art von Element, das reusable_partial erwartet:Immer?
Gibt es viele Situationen, in denen Sie wahrscheinlich nicht brauchen, de-coupled Teiltöne wie diese, und es ist einfacher, auf kurze Sicht für die Verwendung einer Instanz-Variablen. Es ist jedoch schwer, die Zukunft vorherzusagen Anforderungen Ihrer Anwendung.
Als solche, diese macht für das gute Allgemeine Praxis, während mit relativ geringen Kosten.
InformationsquelleAutor der Antwort Edward Anderson
Können Sie beides haben. An der Spitze Ihrer partiellen:
So, es funktioniert mit oder ohne die lokalen Variablen, die Bereitstellung einer vernünftigen Standard, aber nicht die Hemmung der alternativen Verwendung der partiellen.
InformationsquelleAutor der Antwort Vezquex
Ich Stimme für a) einen ganz bestimmten Grund - TROCKEN! Wenn Sie beginnen, die übergabe einer variable - wie - das nächste, was Sie wissen - es ist ein Durcheinander - sagen wir, Sie brauchen, um zu ändern, wie eine variable benannt wird, oder sonst etwas über Sie - dann müssen Sie gehen, um ALLE Ihre Ansichten und ändern Sie anstelle von EINER teilweisen. Auch, wenn Sie Ihre Teil - sagen wir, es erzeugt eine Tabelle mit einigen Ergebnis, es wird sich ändern, auf alle Ihre Ansichten, so müssen Sie wissen, welche Ansichten verwendet werden, eine richtige IDE sollte in der Lage sein, Ihnen dabei zu helfen, aber ich mag auch eine kleine Kommentar-Abschnitt am oberen Rand der Ansicht - wo ich nur erwähnen, wo es verwendet wird und warum - hilft ein anderer Programmierer, und es hilft, Sie zu erinnern, wenn Sie brauchen, um zurück zu kommen zu einer partiellen und ändern. Aber der springende Punkt, der die teilweise ist es zu nennen, OHNE pass etwas aus dem Blick, so dass Sie nicht haben, ändern Sie alle Orte, an denen teilweise wird aufgerufen, wenn die variable ändert sich irgendwie.
Letztlich ist dies ein design der Wahl - und um ehrlich zu sein, es sei denn, Sie betreiben eine facebook die extra Suche Sie tun, ist nicht, dass große einen deal, aber es ist einfach nicht sehr TROCKEN.
P. S.: dachte Nur es - Sie können tatsächlich Abstrakt die Art und Weise rufen Sie teilweise in eine helper-Methode, also dann, wenn die Art und Weise Sie Ihre teilweise ändern muss - dann brauchen Sie nur zu ändern von einem Ort.
InformationsquelleAutor der Antwort konung