AtomPubな何かを作ってみよう その5 〜実装編 Part.04「孫リソースの作成とWebアプリケーションとしての使用」〜

前回は、子リソースの作成まで行いました。今回は、残りのリソースも作成して、ひとまず最初に設計した全てのリソースへのCRUDができるようになるところまでやりたいと思います。

…と言っても、やる事は前回とほとんど同じになるので、ポイントだけさっくりと。

ルーティングの設定

"config/routes.rb"に、"/meanings/{meaning}/namedwords/{namedword}/comments"リソースと、"/meanings/{meaning}/namedwords/{namedword}/stars"リソースのルーティングを追加します。

ActionController::Routing::Routes.draw do |map|
  # '/meanings' or '/meanings/{意味語}' => MeaningsController
  map.resources :meanings, :path_prefix => ''

  # '/meanings/{意味語}'のbaseを設定
  meaning_base = '/meanings/:meaning'

  # '/meanings/{意味語}/namedwords' => NamedwordsController
  map.resources :namedwords, :path_prefix => meaning_base

  # '/meanings/{意味語}/comments' => MeaningscommentsController
  map.resources :comments, :controller => 'meaningscomments', :path_prefix => meaning_base, :name_prefix => 'meanings_'

  # '/meanings/{意味語}/namewords/{名付け語}/comments' => NamedwordscommentsController
  map.resources :comments, :controller => 'namedwordscomments', :path_prefix => meaning_base+'/namedwords/:namedword', :name_prefix => 'namedwords_'

  # '/meanings/{意味語}/namewords/{名付け語}/stars' => NamedwordsstarsController
  map.resources :stars, :controller => 'namedwordsstars', :path_prefix => meaning_base+'/namedwords/:namedword'
end

":name_prefix"を設定しておかないと、URLヘルパを使用する時に区別できなくなってしまうようなので、それぞれ違う名前で設定しておきます。

こんな、階層構造でなおかつ同じキーワードが出てくるURIの設計の仕方が良くないのかもしれませんが(^^;ゞ、こんなURI設計にした場合、こういうルーティング設定にすれば動作するよ、という一つの例として…。

Controllerのbefore_filterを作る

前回もmeaningsに対するbefore_filterを作成しましたが、今回"名付け語"をキーとするリソースを作成したので、リクエスURIから"名付け語"を取得しておくbefore_filterを作成します。

以下のように、"app/controllers/application.rb"にmust_specify_namedwordメソッドを追記します。

class ApplicationController < ActionController::Base
  def must_specify_namedword
    if params[:namedword]
      @namedword = Namedword.find_by_meaning_id_and_name(@meaning.id, params[:namedword])
      unless @namedword
        render :text => '見つかりませんでした。', :status => '404 Not Found'
        return false
      end
    end
    return true
  end
end

その他の作業は省略〜。

Webアプリケーションのバックエンドとして使ってみる

ここまでで、最初に設計した各リソースに対するCRUDを行う事ができるWebサービスができあがりました。

だからと言って、これをWeb上でアクセスできるようにして「さぁ皆さん、じゃんじゃん使ってね♪」と公開したところで、「どう使えばいいの?」という話になるかと思います。

という訳で、それなりに体裁を整えて、普通のWebアプリケーションとしてアクセスできるように、Webサイトを作ってみました。
名付けて.ね〜む

サイトの細かい話は別記事を上げて書こうと思いますが、今回のシリーズ記事で作成したAtomPubサーバ*1をバックエンドにして、単語の検索・登録をできるようにしたWebサイトです。

実際のところ、バックエンドがAtomPubである必要は全く無くて、素直にDBアクセスにした方がよっぽど性能が良くはなるんですが、AtomPubサーバをバックエンドにした場合の練習(?)も兼ねて作ってみたものです。

良かったら使ってみて下さいませ。

次回は?

次回は…現状未定…。サービス文書の話か、リソース同士のリンクの話か…その辺りにしようかと思います。

*1:機能的にまだ不足しているので、"AtomPubサーバ"と名乗るのはちょっと不適切かもしれませんが…。