地名しりとり × はてなスター(Permalink 重要)
急にはてなスターのことを調べたくなったので、地名しりとりにはてなスターを付けました。 地名しりとりについては、過去の日記をご覧ください。
- しりとりに登場した地名にスターを付けられます。
- 面白い地名や思い入れのある地名にスターを付けるといいでしょう。
- 機能はそれだけです。たくさんスターを付けても、特典はありません。
- スターの付いた地名ははてなスター - 地名しりとりで見られます (2007/09/14追記) 。
追記 (2007/09/10)
はてなスター日記で取り上げられていてビックリした。
まちゅさん、ありがとうございまスター。
初めての方のために補足しておくと、地名しりとりは日経ソフトウエア4月号のサンプルプログラムとして作りまスター。 その後、ムックにも収録していただいているので、よかったらご覧ください(宣伝)。
このムックには、竹迫さんの「正しいPerl/CGIの書き方」や大垣さんの「セキュアWebプログラミング入門」や笠谷さんのSeleniumの記事や結城さんの連載記事が載ってて面白い。時間のある休日にのんびり読む感じ。
以下、いつもの日記っぽく
改めて思ったのは、「Permalink重要」ってこと。 これまでの地名しりとりには、以下の3つの画面しかなかった。
- トップページ(最近の10件+次の地名の入力)
- 地名検索ページ(入力した地名から候補を表示)
- 履歴ページ(過去に登場した地名の一覧)
過去に登場した地名の一覧はあっても、それぞれの地名を指し示す Permalink が抜けていた。 Permalink が無いだけで、こんなに不便なことになるとは。
- おもしろい地名を紹介したときにリンクが張れない。
- フィードを配信してもリンク先が無い(とりあえずGoogle Mapsの検索結果をリンク先にしてた)
- 気に入った地名にブックマークやスターが付けられない。
ということで、スターを付けるために、地名に Permalink を付けることにした。 Rails を使っているので、 Permalink の URL はそれほど悩まずに自然に決まった。
http://capping.machu.jp/histories/view/461
histories はコントローラ、 view はアクション、 461 は履歴のIDになる。 view が呼ばれたときのメソッドを、コントローラに追加した。単に ID から履歴を取ってくるだけ。
def view unless params[:id] return redirect_to :action => 'index' end @history = History.find(params[:id], :include => {:area => [:position, :stations]}) end
同じく画面データ (view.rhtml) も作成。 こんなに簡単にできるなら、もっと早くやっておけばよかったよ…。
Permalink ができたので、はてなスターのスクリプトを呼び出す記述を追加した。
<script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script> <script type="text/javascript"> Hatena.Star.EntryLoader.headerTagAndClassName = ['h2']; </script>
はてなスターのスクリプトは、 <h2> 要素の内側にリンクが含まれていれば、それを Permalink とみなすようになっている。 リンクは画面上に表示する必要が無いので、リンクのテキストは空にしている。 本当はスタイルシートで隠すほうがいいのかな?
<h2><%=link_to("", :action => 'view', :id => @history.id) %><%=h @history.area.name %></h2>
Permalink ができたので、履歴の画面からもスターを付けられるようにした。
といっても、普通に Permalink へのリンクを張って、 JavaScript をロードするだけだけどね。 思ったよりも簡単だった。
<script type="text/javascript" src="http://s.hatena.ne.jp/js/HatenaStar.js"></script> <script type="text/javascript"> Hatena.Star.EntryLoader.headerTagAndClassName = ['span', 'name']; </script>
<span class="name"> <%=link_to(history.area.name, :action => 'view', :id => history.id) %> (<%=h history.area.syllabary %>) (後略)
一番大変だったのはトップページ。 スターの対象となる最近10件の地名は、ページのロード後に動的に取得している。 ちょっと悩んだけど、ページの構築後に手動で Hatena.Star.EntryLoader() を呼び出せば動くようになった。
this.histories.each(function(history, index) { /* ページの構築処理をいろいろと */ }.bind(this)); /* はてなスターをロード */ new Hatena.Star.EntryLoader();