at posts/single.html

地名しりとり × はてなスター(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();

関連する日記