Top > 開発ガイド > コンポーネント開発Tips集 > コンテンツからのタグ除去
コンテンツからのタグ除去
対象バージョン
当ドキュメントはRubricks-0.6.x向けです。
概要
Rubricksで提供されるニュースコンポーネントやBBSコンポーネントでは、TinyMCEの機能を利用してWysiwygエディタを使うことができます。 Wysiwygエディタを使うことでリッチなコンテンツを簡単に作成することができます。
通常、Wysiwygを用いて作成されたコンテンツはHTML形式でそのままデータベースに格納されます。 その結果、下記のような問題が発生します。
- 検索結果スニペットの中にタグが混じってしまい、表示がくずれる。preタグで囲ってもタグだらけで読みづらい。
- タグ自体が検索対象になってしまう。例えば画像が含まれるコンテンツが「img」という条件でひっかかる。
Rubricksではこの問題を解決するために「acts_as_strippable」という機能を提供します。 本機能ではHTMLタグを含むコンテンツを保存すると、自動的にタグを取り去ったプレーンなデータが同期を取って保存されます。 検索対象やスニペット表示にそのデータを用いることで、上記の問題を解決することができます。
利用方法
newsをサンプルに利用方法を説明します。
テーブル定義
まず、下記のようにnews_itemsテーブルを定義します。
create_table :news_items, :force => true do |t|
t.column :article, :text, :null => false
t.column :article_plain, :text, :null => false
...
end
ポイントは「article_plain」というカラムです。 articleというカラムにはWysiwygエディタで投稿された内容が格納されます。 対象カラム名+「_plain」という命名規則に従ったカラムに、自動的にプレーンなデータが格納されます。
モデル定義
モデルクラスにacts_as_strippable宣言を記述します。 その際、上述したカラム名を指定します。
#news_item.rb
class NewsItem < ActiveRecord::Base acts_as_strippable :article ... end
内部的には、この宣言をすることでafter_saveにプレーンなデータを格納するコールバックを追加しています。
実行
通常通り、save(またはsave!)メソッドを利用してデータ保存を行うと、自動的にプレーンなデータも格納されます。
news.article = "<html><body><div>aaa</div><span>bbb</span><br></body></html>" news.save! news.article_plain => "aaabbb"
プレーン化ロジックの選択
acts_as_strippableでは下記のようにオプションを渡すことで、データのプレーン化ロジックを指定することができます。
acts_as_strippable :article, :strip_type => :hpricot
また、RAILS_ROOT/config/environment.rb(または環境変数)でデフォルトのプレーン化ロジックを指定することができます。
ENV['RUBRICKS_STRIP_LIB'] = 'hpricot'
ロジックによってライブラリの導入要否や速度などに違いがあります。適宜選択して下さい。 指定できるロジックについてはAPIを参照して下さい。
API
acts_as_strippable 対象カラム名, オプション
引数の説明
| 引数 | 初期値 | 記述可能な型 | 内容 |
| 対象カラム名 | 必須 | Symbol/Array | プレーン化対象のカラム名。指定したカラム名+「_plain」というカラムを準備すると、そこにプレーン化されたデータが格納される。 |
| オプション | 空 | Hash | 詳細として指定する。詳しくは下記参照。 |
オプションの説明
| キー名 | 初期値 | 記述可能な型 | 内容 |
| :strip_type | 環境変数'RUBRICKS_STRIP_LIB'があればその値。なければ:default | Symbol | プレーン化ロジックを指定する。詳しくは下記参照。 |
プレーン化ロジック指定の説明
| キー名 | ライブラリ導入 | 内容 |
| :defalut | なし | 環境変数'RUBRICKS_STRIP_LIB'が指定されていない場合のデフォルト値。Railsに同梱されているHTMLパーサ(TextHelper?/text-scanner)を利用する。 |
| :hpricot | Hpricot(gem) | OSSのHTMLパーサ「Hpricot」を利用する。Cライブラリを利用するため性能が高い。gemでHpricotの導入が必要。 |
