2013-03-19 4 views
2

Je voudrais avoir un bouton qui ressemble à Log in with [FB], wher [FB] est l'icône de police-awesome. (Notez que cette icône apparaît à la fin). A cet effet, cela fonctionne:bouton police-awesome personnalisée avec content_tag

= form_tag my_path, :method => :post do 
    = button_tag do 
    Log in with 
    %i.icon-facebook 

Je voudrais DRY cela en créer une nouvelle méthode d'assistance:

def button_to_with_icon(path, text, button_class, icon) 
    form_tag path, :method => :post do 
     button_tag(:class => button_class) do 
     text 
     content_tag :i, "" , :class => icon.to_sym 
     end 
    end 
    end 

Cependant, l'argument text ne rend pas en HTML. Comment puis-je résoudre ce problème?

+0

fait 'text.html_safe' travail? – omnikron

+0

@omnikron: non, ce n'est pas – AdamNYC

Répondre

5

Le bloc button_tag utilisera ce qui y est retourné sous forme de texte. Ici, vous renvoyez implicitement le content_tag et lançant le texte.

Vous devez utiliser concat dans votre bloc content_tag:

button_tag do 
    concat text 
    concat content_tag(:i, nil, :class => icon.to_sym) 
end 
+0

Merci Sébastien. Cela marche. Cela vous dérange-t-il d'expliquer pourquoi cela fonctionne et la méthode de ckruse ne fonctionne pas? Il me semble que nous sommes des chaînes de concaténation ici? – AdamNYC

+0

@AdamNYC S'il vous plaît marquer la réponse acceptée si cela fonctionne pour vous :) –

+0

Je l'ai fait. Merci. Pourrais-tu m'expliquer la magie? :) – AdamNYC

0

Dans votre code la valeur de retour de text simplement gaspillée obtient. Vous devez retourner une concaténation des deux, le content_tag et text:

def button_to_with_icon(path, text, button_class, icon) 
    form_tag path, :method => :post do 
    button_tag(:class => button_class) do 
     text + content_tag(:i, "" , :class => icon.to_sym) 
    end 
    end 
end 

Une méthode rubis n'est pas ERB :-)

+0

Salut ckruse: Merci de me le rappeler :-). Cependant, '+ 'ne fonctionne pas encore pour moi, car cela forcera' content_tag' à devenir une chaîne comme 'text'. Y a-t-il un moyen d'y échapper? – AdamNYC

+0

Regardez la réponse de @ Sébastien Saunier – ckruse

Questions connexes