💎

【第1章】PHP歴8年・Ruby歴0秒の僕のRailsチュートリアル日記

2020/03/19に公開

こんにちは、たつきちです。

現在PHP歴8年ちょいで、4年ほど前には副著で 技術書を執筆 したりもした、PHPチョットデキル人です←

今更ながらRuby on Railsを学んでみようと思い立ったので、Rails入門者の登竜門 Railsチュートリアル に取り組んでみた様子をブログに連載していきます💪

今回は、全14章中の記念すべき第1章です!

この連載の目次

  • 第1章 ゼロからデプロイまで
  • 第2章 Toyアプリケーション
  • 第3章 ほぼ静的なページの作成
  • 第4章 Rails風味のRuby(準備中)
  • 第5章 レイアウトを作成する(準備中)
  • 第6章 ユーザーのモデルを作成する(準備中)
  • 第7章 ユーザー登録(準備中)
  • 第8章 基本的なログイン機構(準備中)
  • 第9章 発展的なログイン機構(準備中)
  • 第10章 ユーザーの更新・表示・削除(準備中)
  • 第11章 アカウントの有効化(準備中)
  • 第12章 パスワードの再設定(準備中)
  • 第13章 ユーザーのマイクロポスト(準備中)
  • 第14章 ユーザーをフォローする(準備中)

第1章 ゼロからデプロイまで

さっそく第1章を開いて読み始めます。

Tipsをまとめただけの断片的なチュートリアルではなく、それなりの規模のアプリを1つ作り上げるまでの流れを丁寧に教えてくれる教材のようですね。期待が高まります。

さらっと目を通しつつ読み飛ばしていきます。

1.1 はじめに

読み飛ばします。

1.2 さっそく動かす

開発環境に Cloud9 を使うのを推奨しているようですが、PHPerとして長年JetBrainsのPhpStormを使ってきた僕としては、どうしても RubyMine を使いたいです。

それに、Rubyプログラミングはやったことないけど、Ruby製のツールとかは使ったことがあるので、ローカルにはhomebrewで入れたRuby2.7が入っているし、環境面はまあ大丈夫やろと考えています。

現在のRails TutorialはRails 5.1前提の内容のようなので rails 5 ruby version でググってみたところ、Rails 5系はRuby 2.2.2以上で動く ようなので、問題なさそうです。

というわけで、とりあえず今回のRailsチュートリアルはRubyMineの30日無料体験版を使ってやっていこうと思います。(無事にRailsマスターになったら正式版を購入します)

$ brew cask install rubymine

インストールしたら、 Tools > Create Command-line Launcher... して、 mine コマンドでRubyMineを起動できるようにしておきます。

あと、この時点でとりあえず GitHubにリポジトリを作って cloneしておきました。

ここで、gemでRailsをインストールするようです。以下のように ~/.gemrc を作っておくことで、Rubyドキュメントのインストールでいちいち数分待たされたりするのを回避するというあるある設定をしましょうとのこと。言われたとおり実施します。

$ printf "install: --no-document \nupdate:  --no-document\n" >> ~/.gemrc

次にRailsをバージョンを指定してインストールします。

$ gem install rails -v 5.1.6

composerに慣れ親しんでいるPHPerの感覚だと、「これってグローバルインストール?ローカルインストール?」となりますが、どうやらgemコマンドは基本グローバルインストールで、ローカルインストールする場合はBundler + Gemfileを使う感じみたいです。(古い記事ですが参考

$ rails -v
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nio4r-2.5.2 because its extensions are not built. Try: gem pristine nio4r --version 2.5.2
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring websocket-driver-0.6.5 because its extensions are not built. Try: gem pristine websocket-driver --version 0.6.5
Rails 5.1.6

なんかめっちゃ警告みたいなの出てるけどとりあえずインストールはできてるみたいなので一旦無視して進みます笑

1.3 最初のアプリケーション

Hello Worldを作るようです。

1.2.1で推奨しているCloud9 IDEを利用しない場合は、Railsプロジェクトで使うためのenvironmentディレクトリを作成しておいてください

とありますが、続きを読んでみると

$ cd ~/environment
$ rails _5.1.6_ new hello_app

と、 ~/environment をプロジェクトルートとして使っているだけみたいなので、今回は ~/environment は作らず、自分で用意したGitHubリポジトリのcloneのパスで作業することにします。

$ cd /path/to/project
$ rails _5.1.6_ new hello_app

記念すべき最初のRailsプロジェクトができました。ディレクトリ構成は こんな感じとのこと。 まあだいたい想像できる感じですね。

この時点でコミットしておこうと思ったのですが、 git add . すると以下のようにエラーになりました。

error: 'hello_app/' does not have a commit checked out
fatal: adding files failed

ls -la hello_app してみると、 hello_app/.git が存在しています。 rails new したときのログを見返してみたら確かに git init してました。

create
create  README.md
create  Rakefile
create  config.ru
create  .gitignore
create  Gemfile
   run  git init from "."
Initialized empty Git repository in /Users/ttskch/ghq/github.com/ttskch/railstutorial/hello_app/.git/
create  app
 :

(余計なお節介だな・・・)と思いつつ、今回はRailsチュートリアル全体でGit管理したいので hello_app/.git を削除しちゃうことにします。

$ rm -rf hello_app/.git

1.3.1 Bundler

続いてBundlerの説明が書かれています。

rails new 中に bundle install が自動で実行済みとのことなのですが、聞きかじった知識で「確か bundle install --path vendor/bundle ってやらないとgemが全部グローバルにインストールされちゃうんじゃなかったっけ?」と不思議に思いました。

実際、現時点の hello_app 配下には vendor というディレクトリはあるけど中身は空になっています。

これでいいのか?と不安になったのでググってみたところ こちらの記事 を見つけ、「 --path vendor/bundle は付けない派もある」ということが分かったので気にしないことにしました。

というわけで、安心してここまでの作業を コミット します。

Bundler自体については「composerみたいなやつでしょ」という感じでほぼ理解できている(?)のでさらっと読み流します。

Gemfileを編集して各gemのバージョンを固定しましょう(ついでにsqlite3をproductionでは使わないようにも) という指示が出てきたので、言われたとおりにします。

Gemfileを更新して bundle install したら、まず bundle update せい、というエラーになりました。

$ bundle install
You have requested:
  spring = 2.0.2

The bundle currently has spring locked at 2.1.0.
Try running `bundle update spring`

If you are updating multiple gems in your Gemfile at once,
try passing them all to `bundle update`

言われたとおりやり直します。

$ bundle update
$ bundle install

今度は正常に終了しました👍

$ git status
modified:   Gemfile
modified:   Gemfile.lock

いい感じですね。コミット しておきます。

1.3.2 rails server

続いて、 rails server という開発用サーバーを起動してみるそうです。

$ rails server
Could not find byebug-9.0.6 in any of the sources
Run `bundle install` to install missing gems.

謎のエラーになりました。GemfileとGemfile.lockを見てもちゃんと byebug9.0.6 でインストールされているように見えます。 gem list | grep byebug してみても byebug (11.1.1, 9.0.6) と出てくるので問題なさそうに思えます。

bundle install bundle update をやり直してみても変化なし。

一旦Gemfile.lockを削除してインストールし直してみます。

$ rm Gemfile.lock
$ bundle install

すると、Gemfile.lockに差分が現れました。

$ git diff

BUNDLED WITH
-  1.17.2
+  2.1.2

何が起こったのかよく分かりませんが、Bundlerのバージョンが変わったようです🤔

$ bundle -v
Bundler version 2.1.2

rails server を実行してみると、

$ rails server
Traceback (most recent call last):
        5: from bin/rails:3:in '<main>'
        4: from bin/rails:3:in 'load'
        3: from /Users/ttskch/ghq/github.com/ttskch/railstutorial/hello_app/bin/spring:10:in '<top (required)>'
        2: from /Users/ttskch/ghq/github.com/ttskch/railstutorial/hello_app/bin/spring:10:in 'new'
        1: from /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/bundler/lockfile_parser.rb:95:in 'initialize'
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/bundler/lockfile_parser.rb:108:in 'warn_for_outdated_bundler_version': You must use Bundler 2 or greater with this lockfile. (Bundler::LockfileError)

また違うエラーになりました🙄

You must use Bundler 2 or greater with this lockfile だそうです。2.1.2を使っているつもりなのですが・・・

よく分からないですがとりあえず gem update とかしてみます。

$ gem update

その後再度 rails server してみると、

$ rails server
Could not find byebug-9.0.6 in any of the sources
Run `bundle install` to install missing gems.

元のエラーに戻ってきました。

エラーメッセージでググると こんな記事 も見つけましたが、byebug 9.06は ちゃんと存在していました。

が、よく見るとbyebug 9.0.6の依存が bundler ~> 1.7 となっていて、Bundler 2系では動かないのでは?という気がしました。

なんかBundler 2系はめちゃくちゃ最近リリースされたバージョンらしく、まだCI環境で満足に使えない という話もあるようなので、一旦Bundlerを1.7系にダウングレードしてみます。

$ gem install bundler -v 1.17.3
$ rm Gemfile.lock
$ bundle _1.17.3_ install
$ git diff

BUNDLED WITH
-  1.17.2
+  1.17.3
$ bundle -v
Bundler version 1.17.3
$ rails server
Could not find byebug-9.0.6 in any of the sources
Run `bundle install` to install missing gems.

ダメじゃん・・・

一旦 gem uninstall byebug して bundle install byebug し直してみるなどしても変わらず。

ムカついてきたので一旦gemを全削除してみました。

とりあえず gem list で出てきたやつを一気に gem uninstall するっていうのをやってみたんですが、いくつかエラーで止まったりしました。

で、よく考えたらシェルのプロファイルで

export GEM_HOME=$HOME/.gem
export PATH=$HOME/.gem/bin:$PATH

を元々設定していたので、 ~/.gem をまるっと削除してみました。

改めてBundlerを入れ直して、 bundle install します。

$ gem install bundler -v 1.17.3
$ bundle install

で、再度 rails server してみると、

$ rails server
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Could not find rake-13.0.1 in any of the sources
Run `bundle install` to install missing gems.

あ、なんかエラーが変わりました。しかし、 gem list | grep rake してみるとやっぱりインストールされているように見えるし、rake 13.0.1の存在も確認できます。

結局よく分からないので、なんとなく gem install し直してみます。

$ gem install rake
Fetching rake-13.0.1.gem
Successfully installed rake-13.0.1
1 gem installed
$ rails server
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Could not find nokogiri-1.10.9 in any of the sources
Run `bundle install` to install missing gems.

え、変わりました。ということは・・・

$ gem install nokogiri
Building native extensions. This could take a while...
Successfully installed nokogiri-1.10.9
1 gem installed

$ rails server
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Could not find nokogiri-1.10.9 in any of the sources
Run `bundle install` to install missing gems.

アカンのかい。

エラーメッセージで

Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9

と言われているので gem pristine nokogiri --version 1.10.9 してみますが変わらず。

gem pristine --all しましょう というのも試しましたが変わらず。

ググりまくりましたがビシッとした答えが見つかりません。

が、rbenvを使っている人の「rbenvにnokogiriがちゃんと紐づいてませんでした」的な記事をよく見かける印象です。(

そこでピンと来ました。

恐る恐る type rails してみると・・・

$ type rails
rails is /usr/bin/rails

ガーン😱

$GEM_HOME である ~/.gem にインストールされている rails コマンドではなく、macOS(Catalina)にプリインストールsれている rails コマンドが実行されていました。

一所懸命 gem コマンドや bundle コマンドで環境を作っていましたが、それらとまったく関係ない rails コマンドを実行していたのです。そりゃ動かんわ。

試しに ~/.gem/bin/rails server を実行してみたら、普通に動きました😭

しかし、シェルのプロファイルでPATHの設定順序は間違ってはいません。なぜ gem コマンドで入れた rails にパスが通っていなかったのかはマジで謎です・・・

source ~/.zshrc してみたら直りました・・・😓

死ぬほど疲れましたが、とりあえず解決しました。

Bundlerの2系を避けましょうみたいな話にも出会えたので、まあよしとしましょう。

現時点で Gemfile.lock に差分が出ているので、これは コミット しておきます。

1.3.4 Hello, world!

MVCの説明は知っているので読み飛ばして、次はコードを書き換えて実際にHello Worldしてみるようです。

コントローラーにアクションを追加して、ルーティングを追加して、と普通のMVCフレームワークらしい対応をするだけでした。

簡単ですね!(コミット

1.4 Gitによるバージョン管理

Gitは十分に理解しているし環境もあるので自信満々で読み飛ばします!

1.5 デプロイする

第1章の最後はデプロイです。Herokuにデプロイするとのこと。

僕もHerokuは昔から趣味プロジェクトでよく使っているので慣れ親しんでいます。楽勝ですわ。

まずは本番でPostgreSQLを使うために pg なるgemをproduction用の依存に追加します。(コミット

次にHerokuに hello_app をデプロイしていくのですが、チュートリアル的には hello_app がgitのプロジェクトルートになっている前提で、 heroku create からの git push heroku master でデプロイするという手順になっています。

僕はプロジェクトルート配下に hello_app を置く形にしてしまったので、Procfile を自分で書いて hello_app をルートディレクトリとしてサーバーを起動する( php -S localhost:8000 -t <dir> みたいな感じで)ようにしようかと思ったんですが、ググってみた感じ、Railsでは気軽にそんなことはできないっぽかったので、諦めて一旦 hello_app 以下のファイルをすべてプロジェクトルートに移動させました😅(コミット

あとはチュートリアルの指示どおり heroku create git push heroku master でもちろんデプロイできました。

今回のまとめ

  • 調子こいてチュートリアルの言うこと聞かずにローカル開発環境で進めようとしたら嫌なエラーで無駄にハマってつらかった・・・
  • どの言語でも、結局開発環境の構築はつまずくものなんだなーというお気持ち
  • 次回も頑張ります!
GitHubで編集を提案

Discussion