Ruby on Rails

Ruby on Rails でよくあるエラーの原因と解決法【パート1】

更新日:

今回は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アクションにルートが振られています

解決方法

ルーティングを見て、正しいパスを入力する

今回のエラー紹介はここまでになります。エラーを起こしてもあせらず、表示をヒントに紐解きましょうね!

-Ruby on Rails
-,

Copyright© 初心者のためのプログラミング独学ブログ , 2020 All Rights Reserved Powered by STINGER.