2010-11-16 3 views
9

J'ai un petit bijou de rails qui utilise un extrait comme:Rails 3.0.2 Array # rejoindre HTML Safe?

components = [] 
components << label_for(attribute) 
components << ... 
components << text_field(attribute) 
return components.join 

Le bijou a bien fonctionné dans Rails 3.0.1, mais il échappe (rend sous forme de texte dans un navigateur) tous HTML après la mise à jour Rails 3.0.2 . Qu'est-ce que je fais quelque chose de mal? Merci.

Répondre

12

Comme @ SJ26 souligne, utilisez les rails intégrés helper:

<%= safe_join(components) %> 

Ou utiliser mon petit bijou rails_join faire Array#join au courant html de sécurité, auquel cas votre code original fonctionnera tel quel.

+0

nb safe_join a été ajouté aux rails 3.1 – robd

1

Les chaînes sont automatiquement protégées par HTML dans Rails3. Vous devez changer cette dernière ligne à:

return components.join.html_safe 

alternativement, si l'édition de la gemme est trop compliqué, vous pouvez le faire à partir de la vue:

<%= helper_name.html_safe %> 
+0

Merci pour la réponse. Je n'ai eu aucun problème dans Rails 3.0.1 avec 'join' (en utilisant le plus récent HTML-escape). Une raison pour laquelle il échoue spécifiquement dans Rails 3.0.2? Merci. –

+0

J'ai créé une application super simple pour tester votre problème et j'ai constaté que le comportement de la version 3.0.1 était le même que celui de 3.0.2. Les deux échappent au html à moins que je ne le dise (je l'ai fait en utilisant la méthode "brute" dans mon assistant) – jwarchol

+0

Merci JW et Adam. Je viens de faire un test et vous avez raison. Je ne sais pas pourquoi ma gemme travaillait pour la dernière demi-douzaine de versions, mais cela résout mon problème. À votre santé! –

9

String#join n'est pas SafeBuffer -Aware. Cela signifie que votre chaîne est déjà protégée par un code HTML, ce qui empêche les utilisateurs d'insérer des bits HTML dans vos pages. Découvrez this post par Yehuda Katz sur SafeBuffer et pourquoi/comment vous devriez les utiliser.

Si vous avez un tableau de String et SafeBuffer vous voulez concaténer, assurez-vous que vous avez exécuté #html_safe sur tous, ou les #concat dans un SafeBuffer comme si:

['<one>', '<p>two</p>'.html_safe].inject ''.html_safe, &:concat 
=> "&lt;one&gt;<p>two</p>" 

Rails a un intégré en assistant appelé safe_join qui fera cela pour vous.

+1

C'est la meilleure réponse à mon avis. Join semble être intrinsèquement dangereux. Juste une question sur le '.html_safe. Est-ce juste au cas où la première chaîne du tableau n'a pas été marquée comme html_safe? Aussi, quelle est la différence entre & concat et: concat, ce dernier semble fonctionner de la même manière pour moi :) –

+2

La réponse la plus correcte est maintenant d'utiliser ['safe_join (array)'] [http://apidock.com/ rails/ActionView/Aides/OutputSafetyHelper/safe_join] qui est 'Array # join' qui comprend' SafeBuffer'. – sj26

0

que diriez-vous de la citation manuelle?

<%= raw ['<div>', 'any', '</div>'].map{|val| h(val)}.join('<br />') %>