SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

サンプルコードで学ぶRuby on Rails 5実践入門

Rails 5の環境構築とscaffoldで基本構成を体感

サンプルコードで学ぶRuby on Rails 5実践入門 第2回

scaffoldを利用したRailsアプリケーションの基本動作確認

 Rails 5の開発環境構築が一通り完了しました。次にscaffoldを利用してRailsアプリケーションのひな型を作成し、基本動作を確認していきます。

Usersリソースを定義するscaffoldコマンドを実行

 railsコマンドにはさまざまな機能が実装されています。railsのジェネレーター(rails generate)もその1つです。ジェネレーターはRailsのレールにのっとったプロジェクトでよく使われるソースコードのひな型を作成してくれます。まずはRailsチュートリアルにのっとって、Usersリソースに関連するソースコードを作成します

$ bin/rails g scaffold User name:string email:string
Running via Spring preloader in process 566
      invoke  active_record
      create    db/migrate/20161017071626_create_users.rb
      create    app/models/user.rb
      invoke    test_unit
      create      test/models/user_test.rb
      create      test/fixtures/users.yml
      invoke  resource_route
       route    resources :users
      invoke  scaffold_controller
      create    app/controllers/users_controller.rb
      invoke    erb
      create      app/views/users
      create      app/views/users/index.html.erb
      create      app/views/users/edit.html.erb
      create      app/views/users/show.html.erb
      create      app/views/users/new.html.erb
      create      app/views/users/_form.html.erb
      invoke    test_unit
      create      test/controllers/users_controller_test.rb
      invoke    helper
      create      app/helpers/users_helper.rb
      invoke      test_unit
      invoke    jbuilder
      create      app/views/users/index.json.jbuilder
      create      app/views/users/show.json.jbuilder
      create      app/views/users/_user.json.jbuilder
      invoke  assets
      invoke    coffee
      create      app/assets/javascripts/users.coffee
      invoke    scss
      create      app/assets/stylesheets/users.scss
      invoke  scss
      create    app/assets/stylesheets/scaffolds.scss

[Note]プロジェクトローカルのbinコマンド

 rails newコマンドでRailsプロジェクトを作成すると、プロジェクト内にbinディレクトリが自動生成されます。この中には以下のようなものがあります。

$ ls bin/

  ↓

bundle  rails  rake  setup  spring  update

 中身を見ると分かる通り実態はシェルスクリプトで、プロジェクトローカルに各コマンドを実行することができます。例えば、通常railsコマンドをプロジェクトローカルに実行するにはbundle execを接頭辞のように付与する必要がありますが、このbin/railsコマンドを利用することでbundle execを省略することが可能です。

 以降本連載ではbin配下のコマンドを実行する方針で進めます。

 なお、実行コマンドの通り、rails generateコマンドのgenerateはgと省略可能です。本連載では省略系を用いることにします。このscaffoldコマンドではUsersリソースの単数形であるUserとUserモデルが持つフィールドとなるnameとemailをstringで定義しています。

 実行結果をみると、Usersリソースに関連する一連のソースコードが自動生成されていることが分かります。

Userモデルのマイグレーション

 scaffoldによりdb/migration配下にマイグレーションファイルが新規に作成されています。マイグレーションファイルはYYYYMMDDHHMISS_cerate_users.rbとなり、scaffoldを実行した日時を接頭辞として持ちます。これをデータベースに反映させるために、マイグレーションを実行します。

$ bin/rails db:migrate
== 20161017071626 CreateUsers: migrating ======================================
-- create_table(:users)
   -> 0.0497s
== 20161017071626 CreateUsers: migrated (0.0498s) =============================

 マイグレーションを実行しました。こちらもdb:create同様、以前はrakeコマンドでしたが、railsコマンドで実行されている様子が分かります。実行結果のメッセージの通りですが、マイグレーション実行の結果、PostgreSQLのrails5_sample_developmentデータベース上にusersテーブルが作成されていることが確認できます。

$ psql rails5_sample_development
psql (9.5.3)
"help" でヘルプを表示します.

rails5_sample_development=# \d
                   リレーションの一覧
 スキーマ |         名前         |     型     |  所有者
----------+----------------------+------------+----------
 public   | ar_internal_metadata | テーブル   | postgres
 public   | schema_migrations    | テーブル   | postgres
 public   | users                | テーブル   | postgres
 public   | users_id_seq         | シーケンス | postgres
(4 行)

rails5_sample_development=# \d users
                                    テーブル "public.users"
     列     |             型              |                       修飾語
------------+-----------------------------+----------------------------------------------------
 id         | integer                     | not null default nextval('users_id_seq'::regclass)
 name       | character varying           |
 email      | character varying           |
 created_at | timestamp without time zone | not null
 updated_at | timestamp without time zone | not null
インデックス:
    "users_pkey" PRIMARY KEY, btree (id)

 実行されたマイグレーションファイルの中身を確認します。

リスト4 db/migrate/20161017071626_create_users.rb
class CreateUsers < ActiveRecord::Migration[5.0]
  def change
    create_table :users do |t|
      t.string :name
      t.string :email

      t.timestamps
    end
  end
end

 Rails 5からActiveRecord::Migration[5.0]を継承するクラスに変更が加えられていることが分かります。create_tableでusersテーブルを作成し、そのカラムはname、emailのstring型で定義されています。なおRailsではジェネレーター経由で生成された場合、t.timestampsがデフォルトで付与されます。この指定があるテーブルには自動でcreated_at、updated_atカラムが追加されます。

ルーティングの確認

 Railsアプリケーションのルーティングはconfig/routes.rbに定義されています。config/routes.rbを確認すると、Usersリソースに関する定義が追記されていることが分かります。

リスト5 config/routes.rb
Rails.application.routes.draw do
  resources :users
  # For details on the DSL available within this file, see http://guides.rubyonrails.org/routing.html
end

[解説]Railsのリソースにまつわる単語の単数形・複数形

 Railsではリソースを取り扱う場合、注意しなければならない点として、単語の単数形・複数形の違いがあります。Usersリソースという場合、リソースは複数形の暗黙のルールがあるため、「Users」と複数形を用います。しかし、例外的に単数形のみを想定したリソースも定義することができます。

 scaffoldで自動生成されたconfig/routes.rbにresources :usersと、両者とも複数形になっていることで複数形を想定しているリソースであることが表現されています。

 英語がネイティブの方にはイメージがわきやすい点だと思いますが、単数形・複数形をあまり意識することがない日本語がネイティブの方にはとっつきにくい点でしょう。

 同様に、モデルを表す際は「Userモデル」のように単数形で表現します。これはモデルはテーブルの1レコードを表すから、と理解すれば良いでしょう。

 いずれにしても、単数形・複数形で意味が大きく違ってきますので、ジェネレーターコマンドでソースコードを自動生成する場合や手動でソースコードを作成する場合に単数形・複数形に誤りがないよう注意を払う必要があります。

 このルーティング定義に基づいて実際にアクセスできるURLがどのような形式かを確認します。以前はrake routesコマンドでしたが、rails routesコマンドで確認できます。

$ bin/rails routes
   Prefix Verb   URI Pattern               Controller#Action
    users GET    /users(.:format)          users#index
          POST   /users(.:format)          users#create
 new_user GET    /users/new(.:format)      users#new
edit_user GET    /users/:id/edit(.:format) users#edit
     user GET    /users/:id(.:format)      users#show
          PATCH  /users/:id(.:format)      users#update
          PUT    /users/:id(.:format)      users#update
          DELETE /users/:id(.:format)      users#destroy

 実行結果の通り、Usersリソースに対するRestfulなURIが割り当てられていることが分かります。また、usersコントローラーのどのアクションにアクセスが割り振られるかも示されています。indexアクションはUsersリソースの一覧、createアクションはUserモデルのデータベースへの作成、newアクションは新規Userモデルのインスタンス作成、editアクションは既存のUserモデルの編集フォーム、showアクションは既存のUserモデルの表示、updateアクションは既存のUserモデルの更新、destroyアクションは既存のUserモデルの削除であることが読み取れるでしょう。

まとめ

 今回は、Rails 5の開発環境を構築し、scaffoldで自動生成したソースコードを元にルーティングを確認しました。

 次回は、実際の動作をソースコードと関連付けて各アクションについて解説します。

参考文献

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
サンプルコードで学ぶRuby on Rails 5実践入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 竹馬 力(チクバ ツトム)

WINGSプロジェクト について> 有限会社 WINGSプロジェクト が運営する、テクニカル執筆コミュニティ(代表 ...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9806 2016/12/06 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー