Fui un niño malo y usé la siguiente sintaxis en mis plantillas parciales para establecer valores predeterminados para las variables locales si un valor no se definió explícitamente en: hash locals al representar el parcial -
<% foo = default_value unless (defined? foo) %>
Esto parecía funcionar bien hasta hace poco, cuando (sin ninguna razón que pudiera discernir) las variables no pasadas comenzaron a comportarse como si hubieran sido definidas como nulas (en lugar de indefinidas).
Como lo han señalado varias personas útiles en SO, http://api.rubyonrails.org/classes/ActionView/Base.html dice no usar
defined? foo
y en lugar de usar
local_assigns.has_key? :foo
Estoy tratando de enmendar mis formas, pero eso significa cambiar muchas plantillas.
¿Puedo / debo cobrar por adelantado y hacer este cambio en todas las plantillas? ¿Hay algún truco que deba vigilar? ¿Cuán diligentemente necesito probar cada uno?
fuente
local_assigns.fetch
maneja perfectamente incluso las teclas con valor nulo. Devuelve un valor predeterminado solo si la clave no está configurada en absoluto.Como
local_assigns
es un hash, también puedes usar fetch con el opcionaldefault_value
.Esto volverá
default_value
sifoo
no se configuró.ADVERTENCIA:
Tenga cuidado con
local_assigns.fetch :foo, default_value
cuándodefault_value
es un método, ya que se llamará de todos modos para pasarle el resultadofetch
.Si su
default_value
es un método, puede envolverlo en un bloque:local_assigns.fetch(:foo) { default_value }
para evitar su llamada cuando no sea necesario.fuente
nil
valores se conservan aquí. Si el hash contiene:foo
mapeadonil
, entoncesfetch
regresaránil
. Es decir, al menos en mi v1.9.3. No recuerdo cómo se comportó 1.8.local_assigns[:foo] || default_value
, cuando foo devuelve un valor falso,default_value
se utilizará en su lugar. Por lo general, es un problema para Memoization@some_value ||= expensive_method
si el método devuelve un valor falso, siempre se ejecutará.foo ||= local_assigns[:foo] = local_assigns.fetch(:foo, default_value)
foo = local_assigns.fetch :foo, true
Qué tal si
Esto dice "usar
foo
si no es nulo o verdadero. De lo contrario, asignardefault_value
a foo"fuente
foo
es un booleano. Con razón, puede tener el valor defalse
, y ser anuladodefault_value
accidentalmente.Creo que esto debería repetirse aquí (de http://api.rubyonrails.org/classes/ActionView/Base.html ):
Si necesita averiguar si a una determinada variable local se le ha asignado un valor en una llamada de renderización particular, debe usar el siguiente patrón:
Prueba usando definido? El titular no funcionará. Esta es una restricción de implementación.
fuente
En mi caso, uso:
en mi parcial
No tengo idea si eso es bueno, pero para mí está bien
fuente
nil
como local en la llamada parcial también.variable
es un booleano y necesita configurarlofalse
. Utilizará el valor predeterminado en lugar de usar elfalse
valor. ÚSELO BAJO SU PROPIO RIESGO.Sé que es un hilo viejo pero aquí está mi pequeña contribución: lo usaría
local_assigns[:foo].presence
en un condicional dentro del parcial. Luego configurofoo
solo cuando sea necesario en la llamada de renderizado:Echa un vistazo a la guía oficial de Rails aquí . Válido desde RoR 3.1.0.
fuente
local_assigns[:foo]
ylocal_assigns[:foo].presence
. Cualquiera de los dos volveránil
si la clave no existe en el hash y el valor si existe.Creo que una mejor opción que permite múltiples variables predeterminadas:
fuente
Esta es una derivada de la respuesta de Pablo. Esto me permite establecer un valor predeterminado ('completo') y, al final, 'modo' se establece tanto en local_assigns como en una variable local real.
haml / slim:
erb:
fuente
Más intuitivo y compacto:
<% some_local = default_value unless local_assigns[:some_local] %>
fuente
:locals => {:some_local => false}
Si no desea pasar la variable local a parcial cada vez que la llame, haga esto:
De esta forma evitas el
undefined variable
error. Esto le permitirá llamar a su parcial con / sin variables locales.fuente
Ruby 2.5
Erb
Es posible, pero debe declarar sus valores predeterminados en el ámbito.
VARIABLE la palabra para reemplazo.
fuente
Se puede crear un asistente para que se vea así:
Implementado como:
Vea mi blog para obtener detalles sobre cómo y por qué.
Tenga en cuenta que esta solución le permite pasar nulo o falso como el valor sin que se anule.
fuente