2011-02-25 9 views
54
<%= render :partial => 'partial/path', :locals => {:xyz => 'abc'} %> 

vsrendir parcial: objeto vs: locales

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

Creo que el primero haga una variable llamada XYZ local disponible en el parcial y el segundo hace que una variable llamada objeto local disponible en el parcial . Entonces cuál es la diferencia? (Además de los locales permite más que en variable)

Respuesta

30

En el segundo caso usando: objeto definirá una variable con el mismo nombre que el parcial por defecto. Si mi plantilla parcial se denomina _user.html.erb entonces habrá una variable local llamada "usuario" se define en la plantilla.

puede especificar un nombre de variable diferente con: as => "another_name".

Esto está documentado aquí: http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html, aquí: http://apidock.com/rails/ActionView/PartialRenderer

... y para Rieles anterior (versión < = v3.09): http://apidock.com/rails/ActionView/Partials

+3

Documentación trasladó aquí: [http://api.rubyonrails.org/ clases/ActionView/PartialRenderer.html] (http://api.rubyonrails.org/classes/ActionView/PartialRenderer.html) – kimos

48

La segunda forma

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

se asegurará de que la variable account en el parcial se establecerá en @some_account. Puede cambiar el nombre de la variable usando la opción :as.

La mayor ventaja de la :locals es que

  • tiene un control muy clara sobre los objetos y nombres
  • puede asignar más de 1 variable de

por lo que podría hacer algo como

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

haciendo una separación clara poss ible cuando sea necesario.

La desventaja del enfoque :locals es que es más detallado, ya veces un simple

render :partial => 'account' 

es idéntica a

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

Así que utilice la que más le convenga mejor (o donde se adapta mejor).

+0

que tienen un ejemplo en el que puedo acceder al nombre de la: variable de objeto a través del objeto parcial en mi .. . Lo cual es extraño –

+0

Si '@ cuenta' es nulo,': objeto => @ cuenta' no hará que la cuenta esté disponible en el parcial; obtendrá un error al intentar hacer algo como esto: 'si cuenta '. Si no está seguro de si @account se ha definido, use ': locals => {: account => @ account}' –

13

Si está utilizando rieles 3+, hay una sintaxis más fácil de usar:

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

Fuente: Action View Partials

+3

FYI, si está tratando de procesar un parcial desde un controlador, esta forma corta ** lo hará no trabajo**. –

Cuestiones relacionadas