mentionable gemで簡単にmentionが実装できます。(こういうやつ → @komagata)
komagata/mentionable
インストール
gem 'mentionable'
$ bundle install
使い方
app/models/comment.rb:
class Comment
mentionable_as :body
def after_save_mention(new_mentions)
p new_mentions # => ["@komagata", "@machida"]
end
end
Comment
モデルのbody
にmentionが含まれる文章が保存される場合、mentionable_as
でそのカラムを指定したらデフォルトでafter_save_mention
メソッドが呼ばれるので実装して置けばOK。
そのカラムにメンションが含まれていた場合、そのメソッドがコールバックされます。
class Comment
mentionable_as :body, on_mention: :on_mentioned, regexp: /:\w+:/
def on_mentioned(new_mentions)
p new_mentions # => [":komagata:", ":machida:"]
end
end
コールバックメソッドの名前とメンションを抽出するための正規表現は独自のものが指定できる。
便利メソッド
comment = Comment.create(body: '@nobunaga @hideyosi Hi guys.')
comment.mentions # => ["@nobunaga", "@hideyosi"]
comment.new_mentions? # => true
comment.update(body: '@nobunaga @hideyosi @ieyasu Hi guys.')
comment.mentions # => ["@nobunaga", "@hideyosi", "@ieyasu"]
comment.mentions_were # => ["@nobunaga", "@hideyosi"]
comment.new_mentions # => ["@ieyasu"]
comment.new_mentions? # => true
#mentions
でメンションが取れる。
メンションを自分で実装するときの面倒な仕様として、
「メンションを含むテキストがupdateされた場合に増えた分のメンションだけ欲しい。(updateされるたびに通知が行くとうざい)」
というのがありますが、mentionable gemでは最初から新しく増えた分のメンションだけがコールバックメソッドに渡ってくるので楽です。
それらを自分で取る各種メソッドもあります。
#mentions
: メンション全部
#mentions?
: メンションある?
#new_mentions
: 新しいメンション
#new_mentions
: 新しいメンションある?
#mentions_were
: 古いメンション
実際のサービスではコールバックメソッドの中でサイト内通知や通知メールを送ったりすればOK。