怖話でコメント欄がスパムで埋め尽くされて困ったので日本語が入ってないコメントは弾くようにしました。
「日本語が入ってない場合弾く」というのはMovableTypeの時からあるやり方ですが、イマイチ綺麗に実装できる感がしなくて控えてました。しかしmojiという素晴らしいgemを使ったら簡単に出来ました。
class Comment < ActiveRecord::Base
validates_format_of :body,
:with => Moji.regexp(Moji::ZEN_ALNUM | Moji::ZEN_KANA | Moji::ZEN_KANJI),
:message => I18n.t('errors.messages.not_a_zenkaku')
end
mojiは色々な文字種の正規表現を持っていて手軽に組み合わせたりできます。最初はMoji::ZENで全角文字があればOKにしました。しかし実データ(スパム)にはギリシャ文字やキリル文字が存在していたのでそれも除外するようにしました。
$ rails c -E production
>> Comment.all.each {|c| c.destroy unless c.valid? }
これで今までの全てのスパムが消滅。今のところ新しいスパムも防げてるようでスッキリ。
カウンターキャッシュのリセット
以前、update_countersメソッドを使ってカウンターキャッシュを設定したつもりになっていました。しかし、update_countersメソッドは与えた数だけカウンターが増えるという動作だったようです。代わりにreset_countersメソッドを使えばcomments.countの数にresetしてくれるようです。
Story.all.each do |story|
Story.reset_counters(story.id, :comments)
end