Edited at

PadrinoでRESTfulなURLを作ろう

More than 5 years have passed since last update.

Padrinoの好きなところはsinatraよりURLを管理しやすくて、Railsのroutes.rbのように別ファイルで設定するわけではないのが自分的には楽なところ。

基本は全部Padrinoのドキュメントにあるんですが、そこら辺の自分なりのまとめを。

例としてブログシステムのURLを作るとして。


posts.rb

# 投稿用のコントローラ

UrlTest.controllers :posts do

# 全投稿を持ってくる。タイムライン的なものを取得するなら。こんな感じかな。
# /posts
get :index do
end

# 下書きを全部取得するなら
# /posts/drafts
get :drafts do
end

# 指定したIDの投稿を取得する。
# /posts/:id
# 例) /posts/150
get :index, :with => :id do
# withで指定した名前でparamsに入れてくれるので
# 以下のようにIDを取得して投稿の検索に使える。
Post.find params[:id]
end

# 指定したブログの投稿を全部取得する。
# /blogs/:blog_id/posts
# 例) /blogs/10/posts
get :index, :parent => :blogs do
# parentで複数形を指定しても単数形_idでparamsに設定してくれる
blog = Blog.find params[:blog_id]
# で、取得したブログに紐付けた投稿を取得したりしやすい。
blog.posts
end

# あるユーザーの投稿を全部取得する
# /users/:user_id/posts
# 例) /users/123/posts
# もちろん数字じゃなくても受け取れる
# 例) /users/kakkunpakkun/posts
get :index, :parent => :users do
end

# あるユーザーの指定したブログでの投稿を全部取得する
# /users/:user_id/blogs/:blog_id/posts
get :index, :parent => [:users, :blogs] do
# parentの配列で指定した順にURLを作ってくれる
# で、受け取ったparamsからこんな風に検索するのに使えたりする。
User.find(params[:user_id]).blogs.find(params[:blog_id]).posts
end

# 指定した年月の投稿を全部取得する
# /posts/:year/:month
# 例) /posts/2012/12
get :index, :with => [:year, :month] do
# withの配列で指定した順にURLのパスを作ってくれる
year = params[:year]
month = params[:month]
end

# 指定したブログに指定したユーザーがある年月に投稿した投稿を全部取得する
# /blogs/:blog_id/posts/:year/:month
get :index, :with => [:year, :month], :parent => :blogs do
end

# 上の例にさらにユーザーを指定する
# /users/:user_id/blogs/:blog_id/posts/:year/:month
get :index, :with => [:year, :month], :parent => [:users, :blog] do
end

# さらにその中で下書きだけにする
# /users/:user_id/blogs/:blog_id/posts/drafts/:year/:month
get :drafts, :with => [:year, :month], :parent => [:users, :blog] do
end

# いやいや、年月を入れるなら/2012/12/postsという感じにしないとでしょというならこれかな。
# mapを使い始めると管理大変になってくるけど。。
get :year_month_posts, :map => "/:year/:month/posts" do
end
end


特にこういうURLはWebAPIを作成するときにうれしい。すごくWebAPI向きだと思ってて、最初にPadrinoを使った時もWebAPIを提供したくて使った。

ところどころ「そんなURL必要か?」というのもあるけどそこはあくまで例ということで。

時々組み立てようとしてるURLをどのコントローラに書けばいいのか迷うけど、要はなんの情報を扱いたいのかで考えれば迷わずに済む。