sintax rails index escape ruby-on-rails haml

ruby-on-rails - rails - index haml



Haml: controla el espacio en blanco alrededor del texto (13)

En mi plantilla de Rails, me gustaría lograr el HTML final a este efecto usando HAML:

I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met

La plantilla que se acerca:

I will first = link_to ''link somewhere'', ''http://example.com'' - if @condition , then render this half of the sentence if a condition is met

Sin embargo, puede observar que esto produce un espacio entre el enlace y la coma. ¿Hay alguna forma práctica de evitar este espacio en blanco? Sé que hay una sintaxis para eliminar espacios en blanco alrededor de las etiquetas, pero ¿se puede aplicar esta misma sintaxis solo al texto? Realmente no me gusta la solución de marcado adicional para lograr esto.


Aunque no está bien documentado, esto se logra limpiamente usando la preservación de espacios en blanco HAML (>) combinada con un espacio ASCII (& # 32;), y no con ayudantes:

%a{:href=>''/home''}> Home link ,&#32; %a{:href=>''/page''} Next link

Esto producirá lo que quieras:

<a href=''/home''>Anchor text</a>,&#32; <a href=''/page''>More text</a>

Pero estoy de acuerdo, HAML necesita encontrar una forma mejor de hacerlo, ya que agrega caracteres ASCII innecesarios a la página (pero es aún más eficiente que usar ayudantes).


Bien, aquí está la solución en la que me estoy quedando:

Ayudante

def one_line(&block) haml_concat capture_haml(&block).gsub("/n", '''').gsub(''//n'', "/n") end

Ver

I will first - one_line do = link_to ''link somewhere'', ''http://example.com'' - if @condition , then render this half of the sentence //n if a condition is met

De esta forma, el espacio en blanco se excluye por defecto, pero todavía puedo incluirlo explícitamente con una línea "/ n". (Necesita la doble barra invertida porque, de lo contrario, HAML la interpreta como una nueva línea real). ¡Avíseme si hay una mejor opción disponible!


Existe la sintaxis de "espacio en blanco" del paréntesis angular, de lo contrario escriba un método de ayuda para ello.


La función preserve funcionó para mí

.white-space-pre= preserve "TEXT"


La solución que obtuve trabajando es:

I will first = link_to ''link somewhere'', ''http://example.com'' - if @condition = ", then render this half of the sentence if a condition is met"

Puedes usar = , though = se usa para dar salida al resultado del código de Rails, pero aquí servirá para el propósito.


Me encontré con un problema similar y encontré esto, así que pensé en publicar otra solución que no requiere un método de ayuda. Use la interpolación Ruby # {} para envolver el enlace y las declaraciones if:

I will first #{link_to ''link somewhere'', ''http://example.com''}#{if true : ", then render this half of the sentence if a condition is met" end}

Esto funciona en 3.0.18, también puede funcionar en versiones anteriores.


Otra opción que he usado en el pasado:

- if @condition %span> , then some more text after the link.


Puede hacer esto para mantener el espacio principal:

%a{:href => ''http://example.com''}>= '' link somewhere''

El espacio está en las comillas.


Puedes usar la ''sintaxis de Aligator'' de HAML

Eliminación de espacios en blanco:> y <

y <le dan más control sobre el espacio en blanco cerca de una etiqueta. > eliminará todos los espacios en blanco que rodean una etiqueta, mientras que <eliminará todos los espacios en blanco inmediatamente dentro de una etiqueta. Puedes pensar en ellos como cocodrilos comiendo el espacio en blanco:> se enfrenta a la etiqueta y se come el espacio en blanco en el exterior, y <se enfrenta a la etiqueta y se come el espacio en blanco en el interior. Se colocan al final de una definición de etiqueta, después de las declaraciones de clase, id y de atributo, pero antes de / o =.

http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_


También podrías hacer siempre:

= link_to url_path do = ["part_1", "part_2"].join(", ")


También puedes hacer esto usando el modificador "trim whitespace" de Haml. Insertar > después de una declaración Haml evitará que se agregue espacio en blanco a su alrededor:

I will first %a{:href => ''http://example.com''}> link somewhere - if @condition , then render this half of the sentence if a condition is met

produce:

I will first<a href=''http://example.com''>link somewhere</a>, then render this half of the sentence if a condition is met

Sin embargo, como puede ver, el modificador > también quita los espacios en blanco delante del enlace, eliminando el espacio deseado entre las palabras y el enlace. No he encontrado una forma bonita de evitar esto, excepto para agregar &nbsp; al final de "I will first", como ese:

I will first&nbsp; %a{:href => ''http://example.com''}> link somewhere - if @condition , then render this half of the sentence if a condition is met

Que finalmente produce el resultado deseado sin mucha interpolación difícil de leer:

I will first&nbsp;<span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met


Una mejor forma de hacer esto ha sido presentada a través de los ayudantes de Haml:

surround

= surround ''('', '')'' do %a{:href => "food"} chicken Produce:

(<a href=''food''>chicken</a>)

succeed :

click = succeed ''.'' do %a{:href=>"thing"} here Produce:

click <a href=''thing''>here</a>.

precede :

= precede ''*'' do %span.small Not really Produce:

*<span class=''small''>Not really</span>

Para responder la pregunta original:

I will first = succeed '','' do = link_to ''link somewhere'', ''http://example.com'' - if @condition then render this half of the sentence if a condition is met Produce:

I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met


Una vez que he enfocado este tipo de cosas, uso la interpolación de cuerdas:

I will first #{link_to ''Link somewhere''}#{'', then render this half of the sentence if a condition is met'' if condition}

No me gusta el aspecto de la cadena literal en la interpolación, pero lo he usado con cadenas previamente declaradas o cadenas generadas dinámicamente antes.