LoginSignup
32
33

More than 5 years have passed since last update.

PadrinoでRESTfulなURLを作ろう

Last updated at Posted at 2012-12-24

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をどのコントローラに書けばいいのか迷うけど、要はなんの情報を扱いたいのかで考えれば迷わずに済む。

32
33
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
32
33