Ne pas échapper au HTML dans Ruby on Rails

rails 3 semble échapper à tout, y compris au HTML. J’ai essayé d’utiliser raw () mais il échappe toujours au HTML. Y at-il un travail autour? Ceci est mon aide que j’utilise (/helpers/application_helper.rb):

module ApplicationHelper def good_time(status = true) res = "" if status == true res << "Status is true, with a long message attached..." else res << "Status is false, with another long message" end end end 

J’appelle l’aide à mon avis en utilisant ce code:

  

Vous pouvez utiliser .html_safe comme ceci:

 def good_time(status = true) if status "Status is true, with a long message attached...".html_safe else "Status is false, with another long message".html_safe end end <%= good_time(true) %> 

J’ai rencontré cette même chose et découvert une solution plus sûre que l’utilisation de html_safe , en particulier une fois que vous introduisez des chaînes dynamics.

Tout d’abord, le code mis à jour:

 def good_time(long_message1, long_message2, status = true) html = "".html_safe html << "Status is #{status}, " if status html << long_message1 else html << long_message2 end html end <%= good_time(true) %> 

Cela échappe long_message contenu long_message s’il est dangereux, mais le laisse sans échapper s’il est sûr.

Cela permet "long message for success & such." pour afficher correctement, mais échappe également "malicious message " .

L’explication se résume à ceci: 'foo'.html_safe renvoie un ActiveSupport :: SafeBuffer qui agit comme un Ssortingng à tous les égards sauf un: lorsque vous ajoutez une Ssortingng à un SafeBuffer (en appelant + ou <<), cet autre String est échappé HTML avant d'être ajouté au SafeBuffer. Lorsque vous ajoutez un autre SafeBuffer à un SafeBuffer, aucun échappement ne se produira. Rails rend toutes vos vues sous le capot en utilisant SafeBuffers, donc la méthode mise à jour ci-dessus finit par fournir à Rails un SafeBuffer que nous avons contrôlé pour effectuer une fuite sur le long_message “au besoin” plutôt que “toujours”.

Maintenant, le crédit pour cette réponse va entièrement à Henning Koch, et est expliqué beaucoup plus en détail à Tout ce que vous savez sur html_safe est faux – mon récapitulatif ci-dessus tente seulement de fournir l’essence de l’explication dans le cas où ce lien mourrait .