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.fetchmaneja perfectamente incluso las teclas con valor nulo. Devuelve un valor predeterminado solo si la clave no está configurada en absoluto.Como
local_assignses un hash, también puedes usar fetch con el opcionaldefault_value.Esto volverá
default_valuesifoono se configuró.ADVERTENCIA:
Tenga cuidado con
local_assigns.fetch :foo, default_valuecuándodefault_valuees un método, ya que se llamará de todos modos para pasarle el resultadofetch.Si su
default_valuees un método, puede envolverlo en un bloque:local_assigns.fetch(:foo) { default_value }para evitar su llamada cuando no sea necesario.fuente
nilvalores se conservan aquí. Si el hash contiene:foomapeadonil, entoncesfetchregresará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_valuese utilizará en su lugar. Por lo general, es un problema para Memoization@some_value ||= expensive_methodsi 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, trueQué tal si
Esto dice "usar
foosi no es nulo o verdadero. De lo contrario, asignardefault_valuea foo"fuente
fooes un booleano. Con razón, puede tener el valor defalse, y ser anuladodefault_valueaccidentalmente.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
nilcomo local en la llamada parcial también.variablees un booleano y necesita configurarlofalse. Utilizará el valor predeterminado en lugar de usar elfalsevalor. Ú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].presenceen un condicional dentro del parcial. Luego configurofoosolo 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ánilsi 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 variableerror. 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