質問: ### 前提・実現したいこと Ruby on railsの開発環境を作りたいと思っています。 $rails server を行った時に以下のようなエラーが発生しました。 ### 発生している問題・エラーメッセージ ``` Your Ruby version is 2.3.3, but your Gemfile specified 2.6.0 ``` ### 試したこと 幾つか解決策を調べてみたのですが、下記の処理をしてみたところ特に問題はなさそうでした。 $rbenv versions system * 2.6.0-preview1 (set by /Users/*/MyApp/.ruby-version) $which ruby /Users/*/.rbenv/shims/ruby $which bundle /Users/*/.rbenv/shims/bundle ### 補足情報(FW/ツールのバージョンなど) ここにより詳細な情報を記載してください。
回答: ### Ruby バージョンの決定について rbenv が Ruby のバージョンを決定するとき,環境変数 `RBENV_VERSION` が最優先です。 `RBENV_VERSION` の値は ``` $ rbenv shell 2.3.3 ``` みたいにしてセットできます。 これを解除するのは ``` $ rbenv shell --unset ``` です。 今の場合,Rails アプリのルートに `.ruby-version` が存在して ``` 2.6.0-preview1 ``` と書かれているにも関わらず ``` Your Ruby version is 2.3.3, but your Gemfile specified 2.6.0 ``` が出るということは,`RBENV_VERSION` がセットされているとしか考えられません。 この状態で,当該ディレクトリーで ``` $ ruby -v ``` とやったら `2.3.3` と出るでしょう。 つまり,Ruby 2.3.3 が選ばれてしまうのは,`Gemfile` の記述や Rails の仕組み以前の問題です。 新しいターミナルで再度実行するか,`rbenv shell --unset` で解除してから実行すれば,2.6.0-preview1 になると思います。 ### エラーの原因 次に,なぜ ``` Your Ruby version is 2.3.3, but your Gemfile specified 2.6.0 ``` が出るかですが,このメッセージのとおり,`Gemfile` で Ruby のバージョンが 2.6.0 に指定されているはずです。 実際,Ruby 2.6.0-preview1 を使っていて,Rails 5.2.0 で ``` $ rails new hoge ``` として生成される `Gemfile` には,先頭のほうに ``` ruby '2.6.0' ``` という行があります。 こういう行はありませんか? ### 質問者の Gemfile について 質問者の `Gemfile` の中身は ``` # frozen_string_literal: true source "https://rubygems.org" git_source(:github) {|repo_name| "https://github.com/#{repo_name}" } gem "rails" ``` とのこと。 また,Rails のバージョンについて「Gemfile内で特にversionの指定はしてないと思います。」とのことですが,不可解です。 ふつうに ``` $ rails new hoge ``` とやったら,自動生成される `Gemfile` には ``` gem 'rails', '~> 5.2.0' ``` のように Rails のバージョンが書かれるはずです。 ### 2.6.0-preview1 を使うことについて 質問者さんは「Ruby 2.6.0-preview1 で Rails を動かしたらどうなるだろう」という**実験のつもりで** 2.6.0-preview1 をお使いになったのでしょうか。 それならいいのですが,実用にはまだ使えないと思います。 私も追試のため Ruby 2.6.0-preview1 + Rails 5.2.0 で `rails new` してみましたが,作ったものを動かそうとすると Segmentation fault が出て処理系が落ちました。 つまり,処理系に致命的なバグがあって Rails がそのバグを踏んでいるのではないかと思います。 asm さんの回答に対し,質問者さんが > > 上記2つを実行しましたが、 > > [IMPORTANT] > > Don't forget to include the Crash Report log file under > > DiagnosticReports directory in bug reports. > > と出てしまいます。 > > > と書かれていますが,これがたぶんそれ(Segmentation fault)だと思います。 つまり,このときは正しく 2.6.0-preview1 で実行されたのでしょうね。 期待どおり 2.6.0-preview1 で実行されたのは,おそらく `bundle exec` を付けたり `bin/rails` したことは関係なくて,環境変数 `RBENV_VERSION` がセットされていない状態で実行しただけだろうと思います。 というわけで,2.6.0-preview1 の実験でもない限り,Ruby 2.5.1 をお使いになることをお勧めします。 #### オマケ Ruby 2.6.0-preview1 + Rails 5.2.0 で ``` $ rails new hoge ``` としたときに自動生成される `.ruby-version` は ``` 2.6.0-preview1 ``` ではなく ``` 2.6.0 ``` になります。 これだとダメで,`ruby -v` とか `rails -v` とかやろうとすると,エラー ``` rbenv: version `2.6.0' is not installed ``` が出ます。 `.ruby-version` には,rbenv で使用するバージョン表記を書かなければいけないようです。 おそらく `rails new` コマンドは,`RUBY_VERSION` の値を `.ruby-version` に書き込んでいるのでしょうね。 2.6.0-preview1 の場合でも `RUBY_VERSION` の値は `2.6.0` です。 なお,`Gemfile` で Ruby バージョンを指定するときに書く ``` ruby "2.6.0" ``` は,rbenv で使うバージョン表記ではなく,`RUBY_VERSION` の値のようです。 (なので,上記の記述で OK)