Question Supprimer toutes les balises HTML des attributs dans les rails


J'ai un modèle de projet et il a des attributs de texte, l'un est un résumé. J'ai des projets qui ont des balises HTML dans le résumé et je veux les convertir en texte brut. J'ai cette méthode qui a une regex qui va supprimer toutes les balises HTML.

def strip_html_comments_on_data
  self.attributes.each{|key,value| value.to_s.gsub!(/(<[^>]+>|&nbsp;|\r|\n)/,"")}
end

J'ai aussi un filtre before_save

before_save :strip_html_comments_on_data

Le problème est que les balises HTML sont toujours là après la sauvegarde du projet. Qu'est-ce que je rate?

Et existe-t-il un moyen très simple d’appeler cette méthode dans tous les modèles?

Merci,

Nicolás Hock Isaza


11
2018-04-05 00:17


origine


Réponses:


non testé

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = sanitize(html_input)
end

où html_input est une chaîne contenant des balises HTML.

MODIFIER

Vous pouvez supprimer toutes les balises en passant :tags=>[] Comme une option:

plain_text = sanitize(html_input, :tags=>[])

Bien que lisant le docs Je vois qu'il y a une meilleure méthode:

plain_text = strip_tags(html_input)

Puis le faire dans un filtre avant par smotchkiss et vous êtes bon pour y aller.


44
2018-04-05 01:09



Il serait préférable de ne pas inclure d’aide à la vue dans votre modèle. Utilisez simplement:

HTML::FullSanitizer.new.sanitize(text)

10
2017-11-08 07:55



Utilisez simplement l'aide textuelle strip_tags () mentionnée par zetetic


3
2018-04-06 06:13



Tout d'abord, le problème est que Array#each renvoie le tableau d'entrée quel que soit le contenu du bloc. Un couple de personnes vient de passer Array#each avec moi dans une question que j'ai posée: "Retourne le hachage avec les valeurs modifiées dans Ruby".

Deuxièmement, mis à part Array#each ne faisant pas vraiment ce que vous voulez, je ne pense pas que vous devriez le faire de toute façon. Pourquoi auriez-vous besoin d'exécuter cette méthode sur TOUT les attributs du modèle?

Enfin, pourquoi ne pas conserver l’entrée HTML des utilisateurs et utiliser simplement la norme h() aide lors de la sortie?

# this will output as plain text
<%=h string_with_html %>

Ceci est utile car vous pouvez afficher la base de données et voir les données non modifiées exactement comme elles ont été entrées par l'utilisateur (si nécessaire). Si vous devez vraiment convertir en texte brut avant de sauvegarder la valeur, la solution de @zetetic vous permet de démarrer.

include ActionView::Helpers::SanitizeHelper

class Comment < ActiveRecord::Base

  before_save :sanitize_html

  protected
  def sanitize_html
    self.text = sanitize(text)
  end

end

1
2018-04-05 02:09



Désinfectant de Rails de référence directement sans utilisation.

def text
  ActionView::Base.full_sanitizer.sanitize(html).html_safe
end

NOTE: J'ai ajouté .html_safe pour créer des entités HTML comme &nbsp; rendre correctement. Ne l'utilisez pas s'il existe un risque d'injection de code JavaScript malveillant.


1
2017-08-04 14:00



Si vous voulez supprimer &nbsp; avec des balises HTML, nokogiri peut être utilisé

include ActionView::Helpers::SanitizeHelper

def foo
  sanitized_output = strip_tags(html_input)
  Nokogiri::HTML.fragment(sanitized_output)
end

0
2017-09-25 11:43