2010-01-01 16 views
1

J'ajoute une nouvelle colonne, summary, à une table existante. Il contiendra un extrait en texte brut du code HTML de la colonne body.Comment exécuter une migration de modification de données qui utilise strip_tags?

Je souhaite créer des résumés pour tous les e-mails existants lors de la migration. Cependant, je n'arrive pas à comprendre comment utiliser strip_tags dans ma migration.

Voici ce que j'ai jusqu'à présent:

class AddSummaryToEmails < ActiveRecord::Migration 
    self.up 
    add_column :emails, :summary, :string, :limit => 100 

    Email.reset_column_information 
    Emails.all.each do |email| 
     email.update_attributes(:summary => strip_tags(email.body)) 
    end 
    end 

    ... 

end 

Bien sûr, cela ne fonctionne pas: undefined method 'strip_tags' for #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0xb6e29be8>

Comment puis-je accéder à la méthode strip_tags dans mon migration? Je sais que je peux exécuter une expression rationnelle ou une autre solution de contournement, mais je suis toujours désireux de savoir comment faire cela pour un usage futur.

Merci

Répondre

3

Puisque strip_tags est une méthode ActionView et que votre migration hérite d'ActiveRecord, elle ne peut pas voir les méthodes ActionView.

Vous pouvez les obtenir à cette façon, si:

def self.up 
    ActionController::Base.helpers.strip_tags("<b>TEST</b>") 
end 

Si vous essayez d'inclure la variante ActionView, vous aurez undefined method 'full_sanitizer' car vous avez besoin d'étendre les méthodes de classe, et ainsi de suite. Beaucoup plus d'une douleur.

+0

Ah, merci! J'ai essayé d'inclure 'ActionView :: Helpers :: SanitizeHelper' et je suis resté coincé. * Retourne à Ruby OO 101 :) * – nfm

1

Parce que strip_tags est hors de portée. Vous n'avez pas accès à ActionView :: Helpers :: SanitizeHelper. Voir related question

1

wesgarrison solution de ne fonctionne pas pour moi avec Rails 2.3.5 version ainsi afin de rendre le travail que je devais appeler directement HTML désinfectez méthode du HTML :: Module FullSanitizer dans la migration comme celui-ci :

def self.up 
    HTML::FullSanitizer.new.sanitize('<p>Test</p>') 
end 

Espérons que cela aide quelqu'un qui a le même problème que moi.

+0

Les deux ont fonctionné pour moi avec Rails 3.2.13 mais celui-ci semble être le meilleur. –