Dans mon modèle Rails, j'aimerais accomplir le HTML final à cet effet en utilisant HAML:
I will first <a href="http://example.com">link somewhere</a>, then render this half of the sentence if a condition is met
Le modèle qui s'en rapproche:
I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
, then render this half of the sentence if a condition is met
Vous pouvez cependant noter que cela produit un espace entre le lien et la virgule. Existe-t-il un moyen pratique d'éviter cet espace blanc? Je sais qu'il existe une syntaxe pour supprimer les espaces autour des balises, mais cette même syntaxe peut-elle être appliquée uniquement au texte? Je n'aime vraiment pas la solution de balisage supplémentaire pour y parvenir.
Une meilleure façon de le faire a été introduite via les assistants de Haml:
= surround '(', ')' do
%a{:href => "food"} chicken
(<a href='food'>chicken</a>)
click
= succeed '.' do
%a{:href=>"thing"} here
click
<a href='thing'>here</a>.
= precede '*' do
%span.small Not really
*<span class='small'>Not really</span>
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
I will first
<a href="http://example.com">link somewhere</a>,
then render this half of the sentence if a condition is met
Vous pouvez également le faire en utilisant le modificateur "Trim white white" de Haml. Insertion de >
après une déclaration Haml empêchera l'ajout d'espaces autour:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
produit:
I will first<a href='http://example.com'>link somewhere</a>, then render this half of the sentence if a condition is met
Cependant, comme vous pouvez le voir, le >
Le modificateur supprime également les espaces devant le lien, supprimant l'espace souhaité entre les mots et le lien. Je n'ai pas encore trouvé de solution à cela, sauf pour ajouter
à la fin de "Je vais d'abord", comme ceci:
I will first
%a{:href => 'http://example.com'}> link somewhere
- if @condition
, then render this half of the sentence if a condition is met
Ce qui produit finalement la sortie souhaitée sans beaucoup d'interpolation difficile à lire:
I will first <span><a href="http://example.com">link somewhere</a></span>, then render this half of the sentence if a condition is met
D'accord, voici la solution sur laquelle je m'installe:
def one_line(&block)
haml_concat capture_haml(&block).gsub("\n", '').gsub('\\n', "\n")
end
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 cette façon, les espaces sont exclus par défaut, mais je peux toujours l'inclure explicitement avec une ligne "\ n". (Il a besoin de la double barre oblique inverse, sinon HAML l'interprète comme une nouvelle ligne réelle.) Faites-moi savoir s'il existe une meilleure option!
Vous pouvez utiliser la "syntaxe aligator" de HAML
Suppression des espaces blancs:> et <
et <vous donne plus de contrôle sur les espaces près d'une balise. > supprimera tous les espaces entourant une balise, tandis que <supprimera tous les espaces immédiatement dans une balise. Vous pouvez les considérer comme des alligators mangeant les espaces blancs:> fait face à la balise et mange les blancs à l'extérieur, et <fait face à la balise et mange les blancs à l'intérieur. Ils sont placés à la fin d'une définition de balise, après les déclarations de classe, id et attribut, mais avant/ou =.
http://haml.info/docs/yardoc/file.REFERENCE.html#whitespace_removal__and_
Vous pouvez le faire pour conserver l'espace de tête:
%a{:href => 'http://example.com'}>= ' link somewhere'
L'espace est entre guillemets.
Une fois que j'ai adopté ce genre de chose, j'utilise l'interpolation de chaînes:
I will first #{link_to 'Link somewhere'}#{', then render this half of the sentence if a condition is met' if condition}
Je n'aime pas l'apparence de la chaîne littérale dans l'interpolation, mais je l'ai déjà utilisée avec des chaînes précédemment déclarées ou des chaînes générées dynamiquement.
Bien que cela ne soit pas bien documenté, cela est clairement réalisé en utilisant la conservation des espaces blancs HAML (>) combinée avec un espace ASCII (& # 32;), et non avec des assistants:
%a{:href=>'/home'}> Home link
, 
%a{:href=>'/page'} Next link
Cela produira ce que vous voulez:
<a href='/home'>Anchor text</a>, 
<a href='/page'>More text</a>
Mais je suis d'accord, HAML doit trouver une meilleure façon de le faire, car elle ajoute des caractères ASCII ASCII inutiles à la page (mais c'est toujours plus efficace que d'utiliser des assistants).
Il y a la syntaxe des crochets d'angle "munching", sinon écrivez une méthode d'aide pour cela.
Encore une autre option que j'ai utilisée dans le passé:
- if @condition
%span> , then some more text after the link.
J'ai rencontré un problème similaire et j'ai trouvé cela, alors j'ai pensé publier une autre solution qui ne nécessite pas de méthode d'assistance. Utilisez Ruby interpolation # {} pour encapsuler le lien et les instructions 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}
Cela fonctionne dans la version 3.0.18, il peut également fonctionner dans les versions antérieures.
La solution que j'ai obtenue est:
I will first
= link_to 'link somewhere', 'http://example.com'
- if @condition
= ", then render this half of the sentence if a condition is met"
Vous pouvez utiliser =
, bien que =
est utilisé pour sortir le résultat du code Rails, mais ici il servira le but.
La fonction préserver a fonctionné pour moi
.white-space-pre= preserve "TEXT"
Vous pouvez également toujours faire:
= link_to url_path do
= ["part_1", "part_2"].join(", ")