Domanda

nifty_scaffolding di Ryan Bates, ad esempio, fa questo

modifica.html.erb

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

nuovo.html.erb

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

_form.html.erb

<%= form_for @some_object_defined_in_action %>

Questo stato nascosto mi fa sentire a disagio, quindi di solito mi piace farlo

modifica.html.erb

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

_form.html.erb

<%= form_for object %>

Quindi cosa è meglio: a) avere accesso parziale alle variabili di istanza O b) passando ad un partial tutte le variabili di cui ha bisogno?

Ho optato per b) ultimamente, ma mi sono imbattuto in un piccolo sottaceto:

qualche_azione.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 effettua una chiamata al database per andare a prendere il papà!Quindi dovrei accedere a @dad, che tornerebbe a a) avere accesso parziale alle variabili di istanza oppure dovrei passare @dad in locale, cambiando render :p artial in <%= render :p artial => 'parziale', :locals => { :d ad => @dad, :son => a_son } %>, e per qualche motivo passare un mucchio di var al mio partial mi fa sentire a disagio.Forse anche altri la pensano così.

Spero che abbia avuto un senso.Alla ricerca di qualche informazione su tutta questa faccenda...Grazie!

È stato utile?

Soluzione

Nelle versioni recenti di Rails è piuttosto un po 'più facile per rendere parziali e passare gente del posto per loro. Al posto di questo.

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

Si può fare questo.

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

Non faccio questo nel generatore Nifty Ponteggio per mantenere la compatibilità all'indietro, ma cambierò questo in una versione futura.

Per quanto riguarda se è accettabile utilizzare variabili di istanza in parziali. Penso che sia. In tutta la praticità, qual è il rovescio della medaglia? Certamente le cose possono sfuggire di mano se non si è coerenti, ma mi piace di applicare queste linee guida.

  1. Non creare una variabile di istanza solo per condividere tra i parziali. Di solito questo significa si può condividere solo l'oggetto risorsa di controllo.

  2. Se il parziale è lo stesso nome della risorsa, passarlo come un locale con <%= render @item %>.

  3. Se il parziale sarà condiviso tra più controller quindi utilizzare solo la gente del posto.

Questo è ciò che funziona bene per me comunque.

Bonus suggerimento: se vi trovate di passaggio in un sacco di gente del posto in un parziale e si desidera che alcuni di loro di essere opzionale, creare un metodo di supporto che rende il parziale. Poi sempre passare attraverso il metodo di supporto in modo da poter fare un'interfaccia pulita con args opzionali per il rendering parziale.

Altri suggerimenti

Uso @instance_variables in parziali è cattivo design.

Utilizzando variabile di istanza in parziali funziona, ma può rendere più difficile mantenere le applicazioni se sono sempre necessari cambiamenti.

Lo svantaggio di usare variabili di istanza in parziali è che si crea una dipendenza nel parziale qualcosa al di fuori del campo di applicazione parziale (accoppiamento). Questo rende il parziale più difficile da riutilizzare e può forzare cambiamenti in diverse parti dell'applicazione quando si vuole fare un cambiamento in una parte.

I partial che utilizzano variabili di istanza:

  • deve cambiare quando la variabile di istanza in qualsiasi controllore che utilizza le variazioni parziali sia il nome della variabile di istanza o tipo o di dati struttura
  • causano tutte azioni di controllo che utilizzano il parziale per cambiare nello stesso modo e nello stesso tempo in cui vi sono modifiche come viene usata la variabile di istanza
  • scoraggiare il riutilizzo, in quanto possono facilmente solo essere riutilizzati in azioni che impostano le variabili di istanza con lo stesso nome e dati

, invece, passano i locali per i parziali:

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

Ora, perché gli unici riferimenti parziali item e non @item, l'azione che rende la vista che rende il reusable_partial è libero di cambiare senza influire sulla reusable_partial e le altre azioni / vista che lo rendono:

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

Inoltre, questo può essere riutilizzato in contesti in cui non v'è alcuna @item:

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

Se i miei cambiamenti @duck in futuro e non più fa qua qua come reusable_partial si aspetta che (modifiche all'interfaccia dell'oggetto), posso anche utilizzare un adattatore per passare nel tipo di elemento che si aspetta reusable_partial:

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

Sempre?

Ci sono molte situazioni in cui probabilmente non servono parziali de-accoppiati come questo, ed è più facile nel breve periodo ad utilizzare una variabile di istanza. Tuttavia, è difficile prevedere le future esigenze della vostra applicazione.

Come tale, questo rende per una buona pratica generale pur avendo un costo relativamente basso.

Si può avere entrambe le cose. Nella parte superiore del vostro parziali:

<% item ||= @item %>

In questo modo, funziona con o senza passare la variabile locale, fornendo un default sano, ma senza impedire l'uso alternativo del parziale.

Voto per a) per un motivo molto specifico: DRY!Se inizi a passare una variabile - in questo modo - la prossima cosa che sai - è un disastro - diciamo che devi cambiare il modo in cui viene chiamata la tua variabile o qualcos'altro al riguardo - allora devi andare a TUTTE le tue visualizzazioni e cambiarle invece di UNO parziale.Inoltre, se modifichi il tuo partial, diciamo che produce una tabella con qualche risultato, cambierà su tutte le tue visualizzazioni, quindi dovrai sapere quali visualizzazioni vengono utilizzate, un IDE adeguato dovrebbe essere in grado di aiutarti in questo, ma mi piace anche avere una piccola sezione di commenti nella parte superiore della vista - dove menziono solo dove viene utilizzato e perché - aiuta un altro programmatore e ti aiuta a ricordarlo nel caso in cui sia necessario tornare a un parziale e modificarlo.Ma il punto centrale del partial è chiamarlo SENZA dover passare nulla dalla vista, in modo da non dover modificare tutti i punti da cui viene chiamato partial se la variabile cambia in qualche modo.

In definitiva questa è una scelta di design - e ad essere onesti, a meno che tu non stia utilizzando un Facebook, la ricerca extra che fai non è un grosso problema, ma non è molto SECCA.

PS:Ci ho solo pensato: puoi effettivamente astrarre il modo in cui chiami partial in un metodo di supporto, quindi se il modo in cui chiami il tuo partial deve cambiare, allora devi solo modificare un posto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top