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)

Chris Muench
quelle

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

Zauberer von Ogz
quelle
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).

Nathanvda
quelle
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

Ryan
quelle
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