Teilweise rendern: Objekt vs: Einheimische


72
<%= render :partial => 'partial/path', :locals => {:xyz => 'abc'} %>

vs.

<%= render :partial => 'partial/path', :object => @some_object %>

Ich denke, die erste macht eine lokale Variable mit dem Namen xyzim Teil verfügbar und die zweite macht eine lokale Variable mit dem Namen objectim Teil verfügbar. Was ist der Unterschied? (Außerdem localserlaubt mehr als eine Variable)

Antworten:


36

Im zweiten Fall definiert using: object standardmäßig eine Variable mit demselben Namen wie das Teilobjekt. Wenn meine Teilvorlage _user.html.erb heißt, wird in der Vorlage eine lokale Variable mit dem Namen "user" definiert.

Sie können einen anderen Variablennamen angeben mit: as => "another_name".

Dies ist hier dokumentiert: http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html , hier: http://apidock.com/rails/ActionView/PartialRenderer

... und für ältere Rails (Version <= v3.09): http://apidock.com/rails/ActionView/Partials


4
Die Dokumentation wurde hierher verschoben: http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html
Kimos

57

Die zweite Form

render :partial => 'account', :object => @some_account

stellt sicher, dass die accountVariable im Teil auf gesetzt wird @some_account. Sie können die Variable mit der :asOption umbenennen .

Der größte Vorteil von :localsist das

  • Sie haben sehr klare Kontrolle über die Objekte und Namen
  • Sie können mehr als 1 Variable zuweisen

Sie könnten also so etwas tun

render partial => 'some_view', :locals => { :user => account.user, :details => some_details_we_retrieved }

bei Bedarf eine klare Trennung möglich machen.

Der Nachteil des :localsAnsatzes ist, dass er ausführlicher und manchmal einfacher ist

render :partial => 'account'

ist identisch mit

render :partial => 'account', :locals => {:account => @account }

Verwenden Sie also diejenige, die am besten zu Ihnen passt (oder wo sie am besten passt).


Ich habe ein Beispiel, in dem ich über Objekt in meinem Teil auf den Namen der: Objektvariablen zugreifen kann ... Was seltsam ist.
Chris Muench

Wenn @accountNull ist, :object=>@accountwird das Konto im Teil nicht verfügbar gemacht. Beim Versuch, Folgendes zu tun, wird eine Fehlermeldung angezeigt : if account <do something>. Wenn Sie nicht sicher sind, ob @account definiert wurde, verwenden Sie :locals => { :account=>@account }
Fred Willmore

19

Wenn Sie Rails 3+ verwenden, ist die Syntax noch einfacher:

# Instead of <%= render partial: "account", locals: { account: @buyer } %>
<%= render 'account', account: @buyer %>

Quelle: Action View Partials


5
Zu Ihrer Information, wenn Sie versuchen, einen Teil von einem Controller zu rendern, funktioniert diese Kurzform nicht .
Joshua Pinter

4
Als ich den obigen Kommentar las, fragte ich mich: "Was funktioniert also von einem Controller aus?" Die Antwort ist die Version, die den locals:Schlüssel enthält.
Jason Swett
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.