今回はRuby on Railsでよく見るエラーとその意味について解説します!
なんとなくエラー発生状況はエピソード風でお伝えします
1.プロジェクト作成後のディレクトリ移動し忘れ
一つ目は超初歩的なミスであるrails new
でプロジェクト作成後のディレクトリの移動し忘れです(ディレクトリ=フォルダ)
***********
大変だったRuby on Railsの環境構築が終わり、いよいよプロジェクト作成だ!と意気込んでターミナルに打ち込む
>rails new sample_project
勢いよくファイル群が生成されていき、遂に新プロジェクトが出来上がる
そのまま、まず手始めにとrails g controller Users index
を打ち込むといきなりのエラーっぽい表示↓
なぜだ?何もおかしなことはしていないのに
Usage:
rails new APP_PATH [options]
Options:
[--skip-namespace], [--no-skip-namespace] # Skip namespace (affects only isolated applications)
-r, [--ruby=PATH] # Path to the Ruby binary of your choice
# Default: C:/Ruby25-x64/bin/ruby.exe
-m, [--template=TEMPLATE] # Path to some application template (can be a filesystem path or URL)
-d, [--database=DATABASE] # Preconfigure for selected database (options: mysql/postgresql/sqlite3/oracle/frontbase/ibm_db/sqlserver/jdbcmysql/jdbcsqlite3/jdbcpostgresql/jdbc)
# Default: sqlite3
[--skip-yarn], [--no-skip-yarn] # Don't use Yarn for managing JavaScript dependencies
[--skip-gemfile], [--no-skip-gemfile] # Don't create a Gemfile
-G, [--skip-git], [--no-skip-git] # Skip .gitignore file
[--skip-keeps], [--no-skip-keeps] # Skip source control .keep files
-M, [--skip-action-mailer], [--no-skip-action-mailer] # Skip Action Mailer files
-O, [--skip-active-record], [--no-skip-active-record] # Skip Active Record files
[--skip-active-storage], [--no-skip-active-storage] # Skip Active Storage files
-P, [--skip-puma], [--no-skip-puma] # Skip Puma related files
-C, [--skip-action-cable], [--no-skip-action-cable] # Skip Action Cable files
-S, [--skip-sprockets], [--no-skip-sprockets] # Skip Sprockets files
[--skip-spring], [--no-skip-spring] # Don't install Spring application preloader
[--skip-listen], [--no-skip-listen] # Don't generate configuration that depends on the listen gem
[--skip-coffee], [--no-skip-coffee] # Don't use CoffeeScript
-J, [--skip-javascript], [--no-skip-javascript] # Skip JavaScript files
[--skip-turbolinks], [--no-skip-turbolinks] # Skip turbolinks gem
-T, [--skip-test], [--no-skip-test] # Skip test files
[--skip-system-test], [--no-skip-system-test] # Skip system test files
[--skip-bootsnap], [--no-skip-bootsnap] # Skip bootsnap gem
[--dev], [--no-dev] # Setup the application with Gemfile pointing to your Rails checkout
[--edge], [--no-edge] # Setup the application with Gemfile pointing to Rails repository
[--rc=RC] # Path to file containing extra configuration options for rails command
[--no-rc], [--no-no-rc] # Skip loading of extra configuration options from .railsrc file
[--api], [--no-api] # Preconfigure smaller stack for API only apps
-B, [--skip-bundle], [--no-skip-bundle] # Don't run bundle install
[--webpack=WEBPACK] # Preconfigure for app-like JavaScript with Webpack (options: react/vue/angular/elm/stimulus)
Runtime options:
-f, [--force] # Overwrite files that already exist
-p, [--pretend], [--no-pretend] # Run but do not make any changes
-q, [--quiet], [--no-quiet] # Suppress status output
-s, [--skip], [--no-skip] # Skip files that already exist
Rails options:
-h, [--help], [--no-help] # Show this help message and quit
-v, [--version], [--no-version] # Show Rails version number and quit
Description:
The 'rails new' command creates a new Rails application with a default
directory structure and configuration at the path you specify.
You can specify extra command-line arguments to be used every time
'rails new' runs in the .railsrc configuration file in your home directory.
Note that the arguments specified in the .railsrc file don't affect the
defaults values shown above in this help message.
Example:
rails new ~/Code/Ruby/weblog
This generates a skeletal Rails installation in ~/Code/Ruby/weblog.
***********
エラー原因
新しく作成したプロジェクトに移動せずにrailsコマンドを使おうとした
(カレントディレクトリが新しく作成したプロジェクトのディレクトリと一致していなかった)
railsをやってる人なら一度はやったことがあると思います
当然ですがrailsプロジェクトのディレクトリ内でないとrailsコマンドは使えません
プロジェクトのディレクトリ外でrailsコマンドを使おうとすると、上記のようなメッセージが表示されます
このメッセージはrails new
コマンドとそのオプションについて説明しています
ユーザーがrails new
で新プロジェクトを作成したがっている、と予想して教えてくれているんですね(笑)
解決方法
プロジェクトのディレクトリ内にcd
コマンドなどで移動する
2.マイグレーションファイル作成後にファイル実行し忘れる
次は初めは少しややこしいマイグレーションに関するエラーです
***********
プロジェクトディレクトリへ移動し、無事ユーザーコントローラーとインデックスアクションを生成できた(こんな感じ↓)
>rails g controller Users index
create app/controllers/users_controller.rb
route get 'users/index'
invoke erb
create app/views/users
create app/views/users/index.html.erb
invoke test_unit
create test/controllers/users_controller_test.rb
invoke helper
create app/helpers/users_helper.rb
invoke test_unit
invoke assets
invoke coffee
create app/assets/javascripts/users.coffee
invoke scss
create app/assets/stylesheets/users.scss
よし、次はモデルを作ろう!と勢いよくコマンドを打ち込む
>rails g model User name:string
ずらずらと表示される過程
invoke active_record
create db/migrate/20200317105805_create_users.rb
create app/models/user.rb
invoke test_unit
create test/models/user_test.rb
create test/fixtures/users.yml
(補足:2行目からdb/migrate/
にマイグレーションファイル20200317105805_create_users.rb
が作成されていること、3行目からapp/models/
にモデルファイルuser.rb
が作成されていることが分かる)
よし、エラーは出なかった。ユーザーモデル作成完了!ということで一旦rails s
でローカルサーバーを起動すると何やらでかでかとしたエラー表示

このPendingMigrationって何だ?
***********
エラー原因
マイグレーションファイル作成後にrails db migrate
でファイルの実行をしていない
マイグレーションファイルを作成したら、rails db:migrate
などでファイルの実行をする(マイグレートする)必要があります
この操作を忘れるとPendingMigrationErrorが発生します
Pendingは保留中といった意味、Migrationは移動や移行といった意味なので、「移行が保留されている」という意味のエラーといえます
この移行とは、モデルの情報をデータベースに移行する・渡すといった意味合いでしょう
マイグレーションファイルはあくまでモデルの持つカラムとその変数の型をデータベースに教える設計図のようなものであって、それ自体ではデータベースに内容を伝えられません
モデルを生成したり、カラムの変更を反映したりするためには rails db:migrate
でファイルの実行をしないといけません
解決方法
rails db migrate
でマイグレーションファイルを実行する
実行すると以下のような表示が出ます
== 20200317105805 CreateUsers: migrating ======================================
-- create_table(:users)
-> 0.0049s
== 20200317105805 CreateUsers: migrated (0.0055s) =============================
ユーザーテーブルが生成されたことが分かりますね!
3.パスの間違い
3つ目はパスの間違いです。シンプルで原因特定しやすいですが見ておきましょう
***********
よーし、ユーザーモデルを作り、データベースにテーブルも設定できた
インデックスアクションとそれに対応するビューファイルもコントローラー作成時に同時に作られている
まだ何も加工してないけど一度動作確認としてデフォルトのビューファイルを見てみよう。 rails s
と打ち込んでサーバーを立ち上げる
まだリンクがないからブラウザにURLを直接打ち込もう
localhost:3000/index と打ち、エンターキーを押す
あれ?またエラーだ、、
No route matches [GET] "/index"って書いてあるけど、インデックスアクションはあるはずだぞ?

***********
エラー原因
ルーティングで定めていないパスを要求した(存在しないパスを入力した)
No Route Matchesから分かるように今回の例ではlocalhost:3000/indexというパスはルーティングで定められていません
ルーティングで定められていたのはユーザーコントローラー作成時に同時に作った以下のルートだけ
Rails.application.routes.draw do
get 'users/index'
end
なのでURLは正しくはlocalhost:3000/users/indexだったということですね。エラーの例ではusersが抜けていました
ちなみにエラー画面のストライプの表に使えるルートが示してあります。一行目に/users/indexって書いてありますね
エラー画面はエラー解決の重要なヒントなのでググって調べたりする前によく見るようにしましょう
以下は補足です
このルーティングではget 'users/index' => 'users#index'
のように、コントローラーとアクションが明示されていません
こういったルーティングがget 'A/B'
だけの場合は、暗黙にAコントローラーのBアクションにルートが振られます
よって今回はusers_controllerのindexアクションにルートが振られています
解決方法
ルーティングを見て、正しいパスを入力する
今回のエラー紹介はここまでになります。エラーを起こしてもあせらず、表示をヒントに紐解きましょうね!