ruby on rails - ¿Hay una manera de alias/anclar una matriz en YAML?
ruby-on-rails assets (5)
Estoy usando Jammit para empaquetar activos para una aplicación de Rails y tengo algunos archivos de activos que me gustaría incluir en cada uno de los pocos grupos. Por ejemplo, me gustaría que Sammy y sus complementos estuvieran tanto en mi paquete de JS mobile
como en el de screen
.
He intentado esto:
sammy: &SAMMY
- public/javascripts/vendor/sammy.js
- public/javascripts/vendor/sammy*.js
mobile:
<<: *SAMMY
- public/javascripts/something_else.js
y esto:
mobile:
- *SAMMY
pero ambos ponen los archivos de Sammy JS en una matriz anidada, que Jammit no puede entender. ¿Existe una sintaxis para incluir los elementos de un Array directamente en otro Array?
NB : Me doy cuenta de que en este caso solo hay dos elementos en la matriz SAMMY
, por lo que no sería tan malo darles un alias y referencia a cada uno en cada paquete. Eso está bien para este caso, pero rápidamente no se puede mantener cuando hay cinco o diez elementos que tienen un orden de carga específico.
Como se ha sugerido, cuando necesita aplanar una lista, al menos en ruby, es trivial agregar un especificador de tipo "! Flatten" al dispositivo móvil e implementar una clase que extienda Array, agregue el yaml_tag y aplane el codificador siguiente. init_with.
La solución más cercana que conozco es esta:
sammy:
- &SAMMY1
public/javascripts/vendor/sammy.js
- &SAMMY2
public/javascripts/vendor/sammy*.js
mobile:
- *SAMMY1
- *SAMMY2
- public/javascripts/something_else.js
Como alternativa, como ya se sugirió, alise las listas anidadas en un fragmento de código.
Nota: de acuerdo con yaml-online-parser , su primera sugerencia no es un uso válido de << (usado para combinar claves de dos diccionarios. El ancla entonces tiene que apuntar a otro diccionario, creo.
Si quieres que el mobile
sea igual a sammy
, puedes hacer lo siguiente:
mobile: *SAMMY
Sin embargo, si quieres que el mobile
contenga otros elementos además de los de sammy
, no hay forma de hacerlo en YAML, a mi entender.
Su ejemplo es YAML válido (un lugar conveniente para verificar es YPaste ), pero no está definido qué hace la fusión. Según la spec , una clave de combinación puede tener un valor:
- Una asignación, en cuyo caso se fusiona en la asignación principal.
- Una secuencia de asignaciones, en cuyo caso cada una se fusiona, una por una, en la asignación principal.
No hay forma de fusionar secuencias. Usted puede, sin embargo, hacer esto en código. Usando el YAML de tu segunda idea:
mobile:
- *SAMMY
Obtendrás secuencias anidadas, ¡aplanándolas! Suponiendo que tiene un mapeo de tales secuencias anidadas:
data = YAML::load(File.open(''test.yaml''))
data.each_pair { |key, value| value.flatten! }
(Por supuesto, si tienes un archivo YAML más complicado y no quieres que se aplanen todas las secuencias (o no todas son secuencias), tendrás que hacer un poco de filtrado).
esto debería resolver su problema: http://pastie.org/1790173 .
Tenga en cuenta que tuve que crear un grupo default
blanco (o como se le llame) en la parte superior.