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サーバ"と名乗るのはちょっと不適切かもしれませんが…。