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)
実行されたマイグレーションファイルの中身を確認します。
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リソースに関する定義が追記されていることが分かります。
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で自動生成したソースコードを元にルーティングを確認しました。
次回は、実際の動作をソースコードと関連付けて各アクションについて解説します。
