• ブログ
  • Photoshare
  • キーワード
  • ブックマーク
  • ふぉとす
  • 写真
  • ログイン

kaeruspoon

« ニコニコ動画に対応してみた | render の collection は遅かった »
  • map.resourcesを試してみる 2007-11-07 00:00:00 Append 270

    Userモデルと、index(一覧表示)、show(ひとつの表示)、new,create(新規作成)、edit,update(更新)、destroy(削除)のアクションを持つコントローラがあったとすると、config/routes.rbに

    map.resources :users
    

    と書くだけでカッコいいURIを自動で作ってくれます。その確認はrake routesコマンドでOK。

                  users GET    /users                           {:action=>"index", :controller=>"users"}
        formatted_users GET    /users.:format                   {:action=>"index", :controller=>"users"}
                        POST   /users                           {:action=>"create", :controller=>"users"}
                        POST   /users.:format                   {:action=>"create", :controller=>"users"}
               new_user GET    /users/new                       {:action=>"new", :controller=>"users"}
     formatted_new_user GET    /users/new.:format               {:action=>"new", :controller=>"users"}
              edit_user GET    /users/:id/edit                  {:action=>"edit", :controller=>"users"}
    formatted_edit_user GET    /users/:id/edit.:format          {:action=>"edit", :controller=>"users"}
                   user GET    /users/:id                       {:action=>"show", :controller=>"users"}
         formatted_user GET    /users/:id.:format               {:action=>"show", :controller=>"users"}
                        PUT    /users/:id                       {:action=>"update", :controller=>"users"}
                        PUT    /users/:id.:format               {:action=>"update", :controller=>"users"}
                        DELETE /users/:id                       {:action=>"destroy", :controller=>"users"}
                        DELETE /users/:id.:format               {:action=>"destroy", :controller=>"users"}
    

     左から、名前、メソッド、URI、実際のアクション、になります。/usersに対してGETメソッドでアクセスすると一覧表示、同じURIに対してPOSTメソッドでデータを送ると、新しいモデルオブジェクトが作成されます。/users/:idに対してGETメソッドでひとつのデータの表示、PUTメソッドで更新、DELETEメソッドで削除されます。RESTfulでカッコいい。

     さらにUserモデルに1対多でひもつくCarモデルがあった場合、config/routes.rbに

     map.resources :users, :has_many => :cars
    

    と書いてやることで、

    .....省略......
                  user_cars GET    /users/:user_id/cars                  {:action=>"index", :controller=>"cars"}
        formatted_user_cars GET    /users/:user_id/cars.:format          {:action=>"index", :controller=>"cars"}
                            POST   /users/:user_id/cars                  {:action=>"create", :controller=>"cars"}
                            POST   /users/:user_id/cars.:format          {:action=>"create", :controller=>"cars"}
               new_user_car GET    /users/:user_id/cars/new              {:action=>"new", :controller=>"cars"}
     formatted_new_user_car GET    /users/:user_id/cars/new.:format      {:action=>"new", :controller=>"cars"}
              edit_user_car GET    /users/:user_id/cars/:id/edit         {:action=>"edit", :controller=>"cars"}
    formatted_edit_user_car GET    /users/:user_id/cars/:id/edit.:format {:action=>"edit", :controller=>"cars"}
                   user_car GET    /users/:user_id/cars/:id              {:action=>"show", :controller=>"cars"}
         formatted_user_car GET    /users/:user_id/cars/:id.:format      {:action=>"show", :controller=>"cars"}
                            PUT    /users/:user_id/cars/:id              {:action=>"update", :controller=>"cars"}
                            PUT    /users/:user_id/cars/:id.:format      {:action=>"update", :controller=>"cars"}
                            DELETE /users/:user_id/cars/:id              {:action=>"destroy", :controller=>"cars"}
                            DELETE /users/:user_id/cars/:id.:format      {:action=>"destroy",  :controller=>"cars"}
    

    といったURIが作られます。

    名前つきrouteは、モデルのインスタンスを指定してあげるだけ。

    @user = User.find(1)
    user_url(@user)  #=> http://localhost:3000/users/1
    user_path(@user) #=> /users/1
    
    @car = @user.find(2)
    user_car_path(@user, @car)  #=> /users/1/cars/2
    

    さらにすごいのは、link_toとかredirect_toとかform_for

    @user = User.find(1)
    link_to(h(@user.name), @user)  #=> link_to h(@user.name), :controller => "users", :action => "show", :id => 1
    redirect_to(@user) #=> redirect_to "/users/1"
    form_for(@user)  #=> action="/users/1" method="PUT"
    
    @user = User.new
    redirect_to(@user) #=> redirect_to "/users"
    form_for(@user)  #=> action="/users" method="POST"
    

    オブジェクトの状態を見て、空のときとそうでないときとで、URIが変化するのだ。これはすごい。
     ちなみに、carsのようなhas_many状態のrouteでは、単純にオブジエクトを指定するのではなくて名前つきroutesを使用したほうがよさそう。

    Commentコメント(0) Pageリンク元(383)
« ニコニコ動画に対応してみた | render の collection は遅かった »

プロフィール

おおいしつかさ

過去の記事

2006年
12月
2007年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2008年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2009年
1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
2010年
1月 2月 3月

キーワード一覧

ActionScript Ajax AmazonResources Erlang git github iPhone javascript Javascript Kaerukeyword kaeruspoon Mac merb milook MiyazakiResistance NSR Objective-C perl Perl Rails Ruby Ruby on Rails RubyKaigi speedpetal subversion Thin Thinkpad tokyobike TRPG twitter ubuntu Ubuntu VAIO VAIO typeZ Waves WordScoop Xen ぐりぐり しろさん カンタロー スノボー ドトール ドライブ バイク プログラミング ユルさん 執筆 宮崎 日本酒 模型 猫 町田 真中洋嗣 自転車
Baner