Rails作業記録その5

これまで、Model作って、「db/migrate/001_create_items.rb」を編集して、「rake db:migrate」でテーブルを作成して、Controller作って、レイアウトを作成して、とやってきたわけですが、Rails2.0ではこのやり方はもう古いみたいです。(2.0じゃなくて1.2あたりからそうみたい)

Scaffoldを使う前に

わがバイブル(→http://www.amazon.co.jp/dp/4274066967?tag=noirandmomo-22)のP381によると、RESTfulなリソースベースのルーティングを使うScaffoldとして「scaffold_resource」があるので、これを使えばいいと書いてあります。

C:\www\test> ruby script/generate scaffold_resource Hoge title:string
Couldn't find 'scaffold_resource' generator

がーん。ないって言われた。generate.rbのソースを見てもそれらしいものはないし、requireしている先もくまなく見て、関係すると思われるフォルダすべてに grepかけたけど見つからず。なにか重要なものをインストールのときに入れ忘れたか、もう一度入れ直すかと思いつつ、Googleさんにお伺いをたてたところ、「Rails2.0では以前の scaffold_resourceが scaffoldになりました」というありがたいご宣託が。よかったぁ。

Scaffoldを使う

問題ないことがわかったので、とりあえずテストしてみます。

C:\www\test> ruby script/generate scaffold Hoge title:string
      exists  app/models/
      exists  app/controllers/
      exists  app/helpers/
      create  app/views/hoges
      exists  app/views/layouts/
      exists  test/functional/
      exists  test/unit/
      create  app/views/hoges/index.html.erb
      create  app/views/hoges/show.html.erb
      create  app/views/hoges/new.html.erb
      create  app/views/hoges/edit.html.erb
      create  app/views/layouts/hoges.html.erb
      create  public/stylesheets/scaffold.css
  dependency  model
      exists    app/models/
      exists    test/unit/
      exists    test/fixtures/
      create    app/models/hoge.rb
      create    test/unit/hoge_test.rb
      create    test/fixtures/hoges.yml
      create    db/migrate
      create    db/migrate/001_create_hoges.rb
      create  app/controllers/hoges_controller.rb
      create  test/functional/hoges_controller_test.rb
      create  app/helpers/hoges_helper.rb
       route  map.resources :hoges

最後の「route map.resources :hoges」がRESTfulなリソースベースのルーティングを定義してくれるようです。

ルーティングの確認

scaffoldで作成されたルーティングを「rake routes」で確認してみます。

C:\www\test> rake routes
(in C:/www/test)
              hoges GET    /hoges                   {:controller=>"hoges", :action=>"index"}
    formatted_hoges GET    /hoges.:format           {:controller=>"hoges", :action=>"index"}
                    POST   /hoges                   {:controller=>"hoges", :action=>"create"}
                    POST   /hoges.:format           {:controller=>"hoges", :action=>"create"}
           new_item GET    /hoges/new               {:controller=>"hoges", :action=>"new"}
 formatted_new_item GET    /hoges/new.:format       {:controller=>"hoges", :action=>"new"}
          edit_item GET    /hoges/:id/edit          {:controller=>"hoges", :action=>"edit"}
formatted_edit_item GET    /hoges/:id/edit.:format  {:controller=>"hoges", :action=>"edit"}
               item GET    /hoges/:id               {:controller=>"hoges", :action=>"show"}
     formatted_item GET    /hoges/:id.:format       {:controller=>"hoges", :action=>"show"}
                    PUT    /hoges/:id               {:controller=>"hoges", :action=>"update"}
                    PUT    /hoges/:id.:format       {:controller=>"hoges", :action=>"update"}
                    DELETE /hoges/:id               {:controller=>"hoges", :action=>"destroy"}
                    DELETE /hoges/:id.:format       {:controller=>"hoges", :action=>"destroy"}
                           /:controller/:action/:id
                           /:controller/:action/:id.:format

http://localhost/test/hoges」をGETでアクセスすると、indexアクションが動いて、POSTでアクセスすると、createアクションが動くということですね。

参考

  1. こちら(→[Rails 2.0 Preview]新機能いくつか: ぐうたら技術屋のTips)で scaffold_resourceが scaffoldになったことを知りました。ありがとうございます。