Railsコマンドまとめ(基本~応用)

## 前書き

Rails5からrakeコマンドからrailsコマンドに移り変わりました。そこで、自分用のメモとしてRailsコマンドをまとめました。他の人にも参考になれば嬉しいです。

## コントローラー編

#### コントローラーを作るコマンド

ここではTopsControllerを作ると仮定します。

```ターミナル
$ rails g controller tops
```

結果

```
  create  app/controllers/tops_controller.rb
  invoke  erb
  create    app/views/tops
  invoke  test_unit
  create    test/controllers/tops_controller_test.rb
  invoke  helper
  create    app/helpers/tops_helper.rb
  invoke    test_unit
  invoke  assets
  invoke    coffee
  create      app/assets/javascripts/tops.coffee
  invoke    scss
  create      app/assets/stylesheets/tops.css.scss
```

- app/controllers/tops_controller.rb
	- TopsControllerクラス本体
- test/controllers/tops_controller_test.rb
	- TopsController固有のテストスクリプト
- test/controllers/tops_controller_test.rb
	- TopsController固有のビューヘルパー
- app/assets/javascripts/tops.coffee
	- TopsController固有のCoffeeScript
- app/assets/stylesheets/tops.css.scss
	- TopsController固有のSCSS

## モデル編

#### モデルを作るコマンド

ここではTopモデルを作り、そのTopモデルに関するDBのテーブルのカラムがカラム名: name, 型: text であると仮定します。

```ターミナル
$ rails g model top name:text
```

結果

```
  invoke  active_record
  create    db/migrate/20171113101911_create_tops.rb
  create    app/models/top.rb
  invoke    test_unit
  create      test/models/top_test.rb
  create      test/fixtures/tops.yml
```

- db/migrate/20171113101911_create_tops.rb
	- Topモデル固有のマイグレーションファイル
- app/models/top.rb
	- モデルクラス(topsテーブルを操作するためのモデル本体)
- test/models/top_test.rb
	- モデルクラスをテストするためのスクリプト
- test/fixtures/tops.yml
	- テストデータを投入するためのフィクスチャファイル

#### カラムを追加するMigrationファイルを作成

```ターミナル
$ rails g migration AddContentToTop content:text
```

結果

```
invoke  active_record
create    db/migrate/20171113102729_add_content_to_top.rb
```

```db/migrate/20171113102325_add_top_to_content.rb
class AddContentToTop < ActiveRecord::Migration
  def change
    add_column :tops, :content, :text
  end
end
```

このように、topsテーブルにtext型のcontentカラムを追加するマイグレーションファイルが作られます。

#### カラムを削除するMigrationファイルを作成

```ターミナル
$ rails g migration RemoveContentFromTop content:text
```

結果

```
invoke  active_record
      create    db/migrate/20171113102930_remove_content_from_top.rb
```

```db/migrate/20171113102930_remove_content_from_top.rb
class RemoveContentFromTop < ActiveRecord::Migration
  def change
    remove_column :tops, :content, :text
  end
end
```

このように、topsテーブルからtext型のcontentカラムを削除するマイグレーションファイルが作られます。


## データベース編

ここでは、以下のようなデータベースを扱うと仮定します。

```database.yml
default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password:
  host: localhost

development:
  <<: *default
  database: Line_development
  
test:
  <<: *default
  database: Line_test
```

#### データベースに接続

```ターミナル
$ rails dbconsole
```

Railsアプリが接続しているデータベースに接続します。この場合だと、上記のmysql2にユーザーがrootで接続します。

#### データベースの作成

```ターミナル
$ rails db:create
```

結果

```
Created database 'Line_development'
Created database 'Line_test'
```

2つのデータベースが作られます

#### データベースの削除


```ターミナル
$ rails db:drop
```

```
Dropped database 'Line_development'
Dropped database 'Line_test'
```

2つのデータベースが削除されます


### データベースのテーブルレイアウトを作成

```ターミナル
$ rails db:migrate (VERSION=20171113101911)
```

db/migrate/以下のマイグレーションファイルを参照し、データベースのレイアウトが作られます。VERSIONオプションを用いると、特定のマイグレーションファイルのみを実行します。オプションがなければ全てのマイグレーションファイルが実行されます。

### データベースをリセットする

```ターミナル
$ rails db:migrate:reset
```

上記の db:drop, db:create, db:migrateの一連の流れを実行します。

### データベースのテーブルレイアウトを作成したものを取り消し

```ターミナル
$ rails db:rollback (STEP=3)
```

実行されたマイグレーションファイルをdb/schema.rbを参照して取り消します。STEPオプションを用いると、取り消すマイグレーションファイルの数を指定することができます。上の例だと、最新の状態から3つのマイグレーションファイルを取り消します。オプションがなければ最新の状態のマイグレーションファイルだけ(1つだけ)が取り消されます。


### データベースのレイアウトを取り消してから再び作成

```ターミナル
$ rails db:rollback:redo (STEP=3)
```

上記のrails db:rollbackとrails db:migrateをセットにしたものです。マイグレーションファイルを一旦取り消してから再び実行します(redo)。STEPオプションはrails db:rollbackと同様です。


### データベースにダミーデータを追加する1 (db/seeds.rbを利用)

```ターミナル
$ rails db:seed
```

db/seeds.rbファイルを実行します。

```db/seeds.rb
Top.create(content: "A")
```

この場合だと、topsテーブルにcontentカラムの値がAのレコードが追加されます。(id, created_at, updated_atは自動的に挿入されます。)


### データベースにダミーデータを追加する2 (test/fixtures/tops.ymlを利用)

```ターミナル
$ rails db:fixtures:load (FIXTURES=tops)
```

test/fixtures/tops.ymlファイルを実行します。FIXTURESオプションを利用すると、実行するファイルを指定できます。オプションがなければ、test/fixtures/以下のファイル全てが実行されます。



### データベースを参照してschema.rbを生成する

```ターミナル
rails db:schema:dump
```

現在のデータベースを参照して、schema.rbファイルが更新されます。


### schema.rbを参照してSQLのスクリプト文を生成する

```ターミナル
rails db:structure:dump
```

schema.rbファイルに基づくstructure.sqlファイルが生成されます。

例

```rb
class CreateGroups < ActiveRecord::Migration[5.1]
  def change
    create_table :groups do |t|
      t.string :name

      t.timestamps
    end
  end
end
```

上記のようなマイグレーションファイルを実行してから`rails db:structure:dump`コマンドを実行すると

```sql:structure.sql
DROP TABLE IF EXISTS `groups`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `groups` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```

このような、マイグレーションファイルを満たすSQLスクリプトファイルが生成されます。


## その他の便利なコマンド

#### コンソールを実行

```ターミナル
$ rails console
```

コンソールを実行できます。Active::Recordを使ってデータベースにレコードを追加するときによく使いますね！

#### キャッシュの削除

```ターミナル
$ rails tmp:create:clear
```

/tmp/cache/ディレクトリ以下に生成されたキャッシュを削除します


#### 秘密トークンの設定

```ターミナル
$ rails secret
```

結果

```
c3bcedd29a4c60898047e2d6b347c4f0e45a3fb25786bf56385bae50a7fd5fa03fecb25f5c3a01a818985a226dc1f625facfa79de0f00604b4af1b32d1b903f9
```

このように、秘密トークンを生成することができます。

#### ルーティングの確認

```ターミナル
$ rails routes
```

ルーティングの一覧を確認することができます。

#### アセットをコンパイル

```ターミナル
$ rails assets:precompile (RAILS_ENV=production)
```

アセットをコンパイルすることができます。これで本番環境で表示させる準備ができます。

#### アプリやActive Recordで利用できるタイムゾーンの一覧を確認

```ターミナル
$ rails time:zones:all
```

結果

```
* UTC -11:00 *
American Samoa
International Date Line West
Midway Island

...
...
...

* UTC +09:00 *
Osaka
Sapporo
Seoul
Tokyo
Yakutsk

* UTC +09:30 *
Adelaide
Darwin

...
...
...

```

このように、タイムゾーンの一覧を確認することができます。

## あとがき

調べてみると知らなかったコマンドやオプションがたくさんありました。少しでも役に立ったという方は是非
`いいね`
お願いします。