Frage

Ryan Bates' nifty_scaffolding zum Beispiel bedeutet dies

edit.html.erb

<%= render :partial => 'form' %>

new.html.erb

<%= render :partial => 'form' %>

_form.html.erb

<%= form_for @some_object_defined_in_action %>

Der verborgene Zustand macht mich unwohl fühlen, so dass ich in der Regel wie diesen

zu tun

edit.html.erb

<%= render :partial => 'form', :locals => { :object => @my_object } %>

_form.html.erb

<%= form_for object %>

So was besser ist: a) mit partials Zugang Instanzvariablen oder b), die eine teilweise alle Variablen es braucht

Ich habe für b ist die Entscheidung) als in der letzten Zeit, aber ich habe in eine kleine Gurke laufen:

some_action.html.erb

<% @dad.sons.each do |a_son| %>
<%= render :partial => 'partial', :locals => { :son => a_son } %>
<% end %>

_partial.html.erb

The son's name is <%= son.name %>
The dad's name is <%= son.dad.name %>

son.dad macht eine Datenbank Aufruf den Vater zu holen! So hätte ich entweder den Zugriff @dad, die würden zurückgehen a) Variablen partials Zugang Instanz mit oder ich würde @dad in Einheimischen passieren müssen, zu ändern machen: teilweise zu <% = Render: partial => 'teilweise': Einheimische => {: dad => @dad,: son => a_son}%>, und aus irgendeinem Grunde eine Reihe von Vars zu meinem Teil macht mich unwohl fühlen, vorbei. Vielleicht andere fühlen sich auf diese Weise auch.

Wir hoffen, dass einige Sinn. Suchen Sie nach einigen Einblick in diese ganze Sache ... Danke!

War es hilfreich?

Lösung

In den letzten Versionen von Rails ist es ziemlich viel einfacher partials zu machen und übergeben Einheimischen zu ihnen. Statt dessen.

<%= render :partial => 'form', :locals => { :item => @item } %>

Sie können dies tun.

<%= render 'form', :item => @item %>

Ich tue dies nicht im Nifty Scaffold-Generator zu halte Rückwärtskompatibilität, aber ich werde diese Version in einer Zukunft ändern.

Als ob es akzeptabel Instanzvariablen in partials zu verwenden. Ich denke, es ist. In alle Praktikabilität, was ist der Nachteil? Sicherlich können die Dinge aus der Hand, wenn Sie nicht konsistent sind, aber Ich mag diese Richtlinien anzuwenden.

  1. Sie niemals eine Instanzvariable schaffen es nur zwischen partials zu teilen. Normalerweise ist dies bedeutet, dass Sie nur das Controller Ressourcenobjekt teilen.

  2. Wenn der Teil die gleichen Namen wie die Ressource ist, übergeben Sie es als lokal mit <%= render @item %>.

  3. Wenn die Teil wird über mehrere Controller geteilt werden dann nur die Einheimischen verwenden.

Dies ist, was für mich gut funktioniert trotzdem.

Bonus-Tipp: , wenn Sie sich in einer Menge von Einheimischen in einen Teil finden vorbei und Sie wollen einige von ihnen optional sein, erstellen Sie eine Hilfsmethode, die die Teil macht. Dann immer geht durch die Hilfsmethode, so dass Sie eine saubere Schnittstelle mit optionaler args für die Wiedergabe des Teils machen können.

Andere Tipps

@instance_variables in partials Verwendung ist schlechtes Design.

Mit Instanzvariable in partials funktioniert, aber es kann es schwieriger machen Anwendungen zu pflegen, wenn Änderungen je benötigt.

Der Nachteil Instanzvariablen in partials der Verwendung ist, dass Sie eine Abhängigkeit in dem Teil etwas außerhalb des Teils Anwendungsbereich (Kupplung) erstellen. Dies macht die teilweise schwieriger zu Wiederverwendung und Änderungen in verschiedenen Teilen der Anwendung erzwingen kann, wenn Sie eine Änderung in einem Teil machen wollen.

Partials, dass die Verwendung Instanzvariablen:

  • muss geändert werden, wenn die Instanz-Variable in jedem Controller, der die partiellen Änderungen entweder die Instanzvariablennamen oder den Typen oder Datenstruktur
  • nutzt
  • Ursache alle Controller-Aktionen, die die teilweise Verwendung in der gleichen Art und Weise zur gleichen Zeit zu ändern, wenn es Änderungen, wie die Instanz-Variable verwendet wird
  • entmutigen Wiederverwendung, da sie nur leicht in Aktionen wiederverwendet werden können, die Instanzvariablen mit dem gleichen Namen einrichten und Daten

Stattdessen übergeben Einheimischen zu den partials:

<%= render 'reusable_partial', :item => @item %>

Nun, da die teilweise nur Referenzen item und nicht @item, die Aktion, die die Ansicht rendert, die die reusable_partial macht frei zu ändern, ohne die reusable_partial zu beeinflussen und die anderen Aktionen / Ansichten, die es machen:

<%= render 'reusable_partial', :item => @other_object.item %>

Auch kann dies in Kontexten wiederverwendet werden, wenn kein @item ist:

<%= render 'reusable_partial', :item => @duck %>

Wenn meine @duck Veränderungen in der Zukunft und nicht quaken mehr wie reusable_partial erwartet sie (die Schnittstelle des Objekts ändert), kann ich auch einen Adapter verwenden, in der Art von Elemente zu passieren, dass reusable_partial erwartet:

<%= render 'reusable_partial', :item => itemlike_duck(@duck) %>

Immer?

Es gibt viele Situationen, in denen Sie wahrscheinlich nicht brauchen entkoppelten partials so, und es ist einfacher, auf kurze Sicht eine Instanzvariable zu verwenden. Allerdings ist es schwierig, die zukünftigen Anforderungen Ihrer Anwendung zu prognostizieren.

Als solche macht dies für eine gute allgemeine Praxis, während relativ geringen Kosten.

Sie können es haben beide Weisen. An der Spitze des Teil:

<% item ||= @item %>

Auf diese Weise funktioniert es mit oder ohne die lokale Variable vorbei, einen vernünftigen Standard bereitstellt, nicht aber alternative Nutzung des Teils hemmen.

I vote for a) für einen ganz bestimmten Grund - DRY! Wenn Sie eine Variable beginnen vorbei - so - das nächste, was Sie wissen - es ist ein Chaos - lassen Sie uns sagen müssen Sie die Art und Weise ändern Sie Ihre Variable mit dem Namen oder etwas anderes über sie -, dann müssen Sie alle Ihre Ansichten gehen und sie ändern statt ein Teil. Auch - wenn Sie Ihre teilweise ändern - lassen Sie uns sagen, dass es eine Tabelle mit einigen Ergebnis führt, wird es auf alle Ihre Ansichten ändern, so dass Sie müssen wissen, welche Ansichten verwendet werden, sollte eine richtige IDE Lage sein, Ihnen dabei zu helfen, aber ich mag auch einen kleinen Kommentar Abschnitt am oberen Rande der Ansicht, die - wo ich nur erwähnen, wo es verwendet wird und warum - hilft einer anderen Programmierer und es hilft Ihnen, wenn Sie zu einem Teil kommen müssen zu erinnern und ändern. Aber der ganze Sinn des Teils ist es zu nennen, ohne etwas aus der Sicht zu passieren, damit Sie müssen alle Orte nicht ändern, wo teilweise heißt aus, wenn dieser Variable ändert mich irgendwie.

Letztlich ist dies ein Design-Wahl -. Und um ehrlich zu sein, wenn Sie einen Facebook laufen die zusätzlichen Lookup Sie tun, ist nicht, dass große Sache, aber es ist einfach nicht sehr trocken

P. S .: Ich dachte darüber - man kann tatsächlich abstrakt so, wie Sie in einem Hilfsmethode Teil rufen, so dann, wenn die Art und Weise Sie Ihre Teil-Anforderungen ändern nennen -. Dann müssen Sie nur an einer Stelle ändern

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top