Railsアプリにブックマークレットを実装する

SBMなどのWebアプリケーションには欠かせないブックマークレットですが
Railsで作ったアプリに付け加えてみたいなあと考えていました。

プラグイン

とりあえず探してみると、下のようなプラグインを見つけました。

Bookmark It! Rails plugin for adding bookmarklets.
http://blog.nanorails.com/articles/2006/12/18/bookmark-it-rails-plugin-for-adding-bookmarklets

しかし、古めの記事だったのと、面倒くさそうだったので今回は回避しました。
使ったことがある方がいれば感想が聞きたいです。

コントローラに書き加える方法

次に発見したのがこの記事です。

Creating and Integrating Bookmarklets with Rails
http://railstips.org/2008/11/13/creating-and-integrating-bookmarklets-with-rails

直にコントローラに書き込むことで実装しています。
丁寧にもサンプルムービーもあり、手軽そうだったのでこの方法を試すことにしました。

Creating and Integrating Bookmarklets with Rails
http://video.railstips.org/creating-and-integrating-bookmarklets-with-rails/

ブックマークレットの実装

上のページを参考に実装を紹介します。

ビュー

まずは、ブックマークレットの本体を用意します。
index.html.erbなど適当なところに貼り付けます。

<p>
  <a href="javascript:var d=document,w=window,e=w.getSelection,k=d.getSelection,x=d.selection,s=(e?e():(k)?k():(x?x.createRange().text:0)),f= 'http://<%= request.host_with_port %>/bookmarks/new',l=d.location,e=encodeURIComponent,p='?v=1&u='+e(l.href)%20+'&t='+e(d.title.replace(/^\s*|\s*$/g,''))%20+'&s='+e(s),u=f+p;location.href=u;">
    ブックマークする
  </a>
</p>
コントローラ

次にコントローラに受け手の役目のコードを書きます。
SBMの場合、ブックマークレットを押すとフォームに入力されていればよいので
scaffoldで生成したコードだと、newメソッドなどに書き加えます。

@bookmark.title   = params[:t]
@bookmark.content = params[:s]
@bookmark.url     = params[:u]


これは先ほどのブックマークレットに改行を加えたものです。

<p>
  <a href="javascript:var d=document,
			   w=window,
			   e=w.getSelection,
			   k=d.getSelection,
			   x=d.selection,
			   s=(e?e():(k)?k():(x?x.createRange().text:0)),
			   f= 'http://<%= request.host_with_port %>/bookmarks/new',
			   l=d.location,
			   e=encodeURIComponent,
			   p='?v=1&u='+e(l.href)%20+'&t='+e(d.title.replace(/^\s*|\s*$/g,''))%20+'&s='+e(s),
			   u=f+p;
			   location.href=u;
  ">
    ブックマークする
  </a>
</p>

uにURLを、tにタイトル、sに選択範囲が渡されていることがわかります。
これらのパラメータを調整することで、使い方は色々考えれそうです。