如何运行使用strip_tags的数据修改迁移?

时间:2010-01-01 02:16:55

标签: ruby-on-rails migration strip-tags

我正在向现有表添加新列summary。它将包含body列中HTML的纯文本片段。

我想在运行迁移时为所有现有电子邮件创建摘要。但是,我无法弄清楚如何在迁移中使用strip_tags。

这是我到目前为止所拥有的:

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

当然,这不起作用: undefined method 'strip_tags' for #<ActiveRecord::ConnectionAdapters::MysqlAdapter:0xb6e29be8>

如何在迁移中访问strip_tags方法?我知道我可以运行正则表达式或其他类似的解决方法,但我仍然希望了解如何将其用于将来的使用。

由于

3 个答案:

答案 0 :(得分:4)

由于strip_tags是一个ActionView方法,并且您的迁移继承自ActiveRecord,因此无法看到ActionView方法。

但是你可以通过这种方式找到他们:

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

如果尝试包含ActionView变体,则会得到undefined method 'full_sanitizer',因为您需要扩展类方法,依此类推。更多的痛苦。

答案 1 :(得分:1)

因为strip_tags超出了范围。您无权访问ActionView :: Helpers :: SanitizeHelper。 见related question

答案 2 :(得分:1)

wesgarrison 的解决方案对我来说对Rails 2.3.5版本不起作用,所以为了使它能够工作,我不得不直接从HTML :: FullSanitizer模块中调用HTML sanitize方法。像这样的迁移:

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

希望这可以帮助那些和我有同样问题的人。