2018年以降の記事はGitHub Pagesに移行しました

Rails3レシピブックを読みながらRailsを学ぶ モデル、コントローラ、ビュー、Railsの規約など

前回までのあらすじ

Railsをインストールして起動する所まではできた。

参考

  • Rail3レシピブック 190の技

環境

MVCを自動生成する

アプリケーションのscaffold(足場)の作成

scaffoldジェネレータを実行する事でCRUD操作が可能な簡単なアプリケーションの足場が生成できる。コマンドはrails generate ジェネレータ モデル名 カラム名:型 カラム名:型 (以下繰り返せる)...

$ bundle exec rails generate scaffold Blog name:string user_id:integer
      invoke  active_record
      create    db/migrate/20120229022816_create_blogs.rb
      create    app/models/blog.rb
      invoke    test_unit
      create      test/unit/blog_test.rb
      create      test/fixtures/blogs.yml
       route  resources :blogs
      invoke  scaffold_controller
      create    app/controllers/blogs_controller.rb
      invoke    erb
      create      app/views/blogs
      create      app/views/blogs/index.html.erb
      create      app/views/blogs/edit.html.erb
      create      app/views/blogs/show.html.erb
      create      app/views/blogs/new.html.erb
      create      app/views/blogs/_form.html.erb
      invoke    test_unit
      create      test/functional/blogs_controller_test.rb
      invoke    helper
      create      app/helpers/blogs_helper.rb
      invoke      test_unit
      create        test/unit/helpers/blogs_helper_test.rb
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/blogs.js.coffee
      invoke    scss
      create      app/assets/stylesheets/blogs.css.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.css.scss

いろいろ生成された! 確かに前回のまとめたファイルとディレクトリの役割通りにファイルが生成されてるっぽい。

テーブルの作成

テーブルをDBに定義。rake db:migrateコマンドを実行する。足場を作った際にdb/migrate/20120229022816_create_blogs.rbというマイグレーションファイルができたので、これを使っている?

$ bundle exec rake db:migrate
==  CreateBlogs: migrating ====================================================
-- create_table(:blogs)
   -> 0.0000s
==  CreateBlogs: migrated (0.0000s) ===========================================

作られたようだ。

マイグレーションとは
  • DBのスキーマを変更する機能
  • 一気に作らずちょっとずつ変更もできる
  • rails generate migration マイグレーション名で作成可能
  • 上記の場合はscaffoldジェネレータで全部一括で作成している様子
    • db/migrate/20120229022816_create_blogs.rb
また起動

で、わくわくしながら起動。アドレスはhttp://localhost:3000/blogs。Listing blogsというページとCRUDできるフォームが用意されたページが!

Blogモデルを作成して、blogsになったのは規約ってやつだろうか……といったところで次のレシピが規約だった。

Railsの規約

  • 設定ファイルはあまり作らない
  • ファイル名、クラス名、ディレクトリの場所に規則

規則を知る事でどこでなにやってるのかわかりそう。

コントローラ
  • app/controllers/に格納
  • クラス名は単語区切りキャメルケースで「(先頭大文字)コントローラController」 => BlogsController
  • ファイル名はクラス名をスネークケースに変換 => blogs_controller.rb
  • 名称は対応するモデルの複数系 => BlogモデルのコントローラなのでBlogs
    • scaffoldで生成されたモデルとコントローラもこの規則に従っている

なるほどね。だからBlogモデルでコントローラはBlogsだったのか。

モデル
  • app/models/に格納
  • クラス名は単語区切りキャメルケースで名詞の単数形 => Blog
  • ファイル名はクラス名をスネークケースに変換 => blog.rb
  • モデルとDBテーブルは1:1で対応 => モデルBlog : blogsテーブル
  • 変換ルールはActiveSupportで定義されている
ビュー
  • app/views/コントローラ名/にテンプレート
    • 上で作ってたblogの場合app/views/blogsの下
  • ビューファイル名はindex.html.erb, show.html.erb 等
    • アクション名.フォーマット名.レンダリングエンジン名の規則で命名
    • レンダリングエンジンerbは任意のテキストファイルにRubyコードを埋められるもの。Javajspみたいなもん?
    • hamlとかでもいい?
  • show.html.erb の場合はshowアクションを実行する場合show.html.erbをerbでレンダリングしてhtmlフォーマットで出力とかそういう感じかな

……ここまではなんとか。どこで何してるかとかは少しずつわかってきた。