I’m pleased to announce Profanity Filter for Rails. This gem filters undesirable words from text and displays a friendly version. Filtering is non-destructive by default but has the option of replacing the original text. It’s based on a dictionary that is customizable so you can add additional words as needed.

Profanity Filter is the evolution of a plugin I created a few years ago called Fu-Fu (the Profanity Filter for Rails). This new version has been renamed, tested with Rails 3 and has been moved over to the Intridea github account to ensure proper support (bug fixing, development time, etc) going forward.

Installation

gem install profanity_filter

Rails 3 with Bundler

Open your Gemfile and add:

gem "profanity_filter"

Rails 2.x without Bundler

Open config/environment.rb and add:

config.gem "profanity_filter"

Usage: Basic

You can call the profanity_filter method within your ActiveRecord models.

class Post < ActiveRecord::Base profanity_filter :title, :body end 1 class Post & lt ; ActiveRecord :: Base profanity_filter : title , : body end

Usage: Non-Destructive

Filters content when called, original text remains in the database.

profanity_filter :foo, :bar #=> banned words will be replaced with @#=>$% profanity_filter :foo, :bar, :method => 'dictionary' #=> banned words will be replaced by value in config/dictionary.yml profanity_filter :foo, :bar, :method => 'vowels' #=> banned words will have their vowels replaced profanity_filter :foo, :bar, :method => 'hollow' #=> all letters except the first and last will be replaced Non-destructive versions of the filtered attribute: some_model.foo => 'filtered version' some_model.foo_original => 'non-filtered version' 1 profanity_filter : foo , : bar #=> banned words will be replaced with @#=>$% profanity_filter :foo, :bar, :method => 'dictionary' #=> banned words will be replaced by value in config/dictionary.yml profanity_filter :foo, :bar, :method => 'vowels' #=> banned words will have their vowels replaced profanity_filter :foo, :bar, :method => 'hollow' #=> all letters except the first and last will be replaced Non-destructive versions of the filtered attribute: some_model.foo => 'filtered version' some_model.foo_original => 'non-filtered version'

Usage: Destructive

Filters content in the database, original text is lost. Note the “!” when calling the profanity_filter method.

profanity_filter! :foo, :bar #=> banned words will be replaced with @#=>$% profanity_filter! :foo, :bar, :method => 'dictionary' #=> banned words will be replaced by value in config/dictionary.yml profanity_filter! :foo, :bar, :method => 'vowels' #=> banned words will have their vowels replaced profanity_filter! :foo, :bar, :method => 'hollow' #=> all letters except the first and last will be replaced 1 profanity_filter ! : foo , : bar #=> banned words will be replaced with @#=>$% profanity_filter! :foo, :bar, :method => 'dictionary' #=> banned words will be replaced by value in config/dictionary.yml profanity_filter! :foo, :bar, :method => 'vowels' #=> banned words will have their vowels replaced profanity_filter! :foo, :bar, :method => 'hollow' #=> all letters except the first and last will be replaced

You can find additional information in the README.

Contributing

I’ve used this on a number of projects and it’s served me well but it’s by no means perfect. If you find something that doesn’t work for you or have a suggestion please let me know and I’ll see what I can do (directly or through Github Issues). If you have an improvement/refactoring I welcome pull requests on Github. The project has a full test suite with benchmarking and the code base is tiny so feel free to jump in!

You can find Profanity Filter on Intridea’s Github account.