【第1章】PHP歴8年・Ruby歴0秒の僕のRailsチュートリアル日記
こんにちは、たつきちです。
現在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を見てもちゃんと byebug
が 9.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
でもちろんデプロイできました。
今回のまとめ
- 調子こいてチュートリアルの言うこと聞かずにローカル開発環境で進めようとしたら嫌なエラーで無駄にハマってつらかった・・・
- どの言語でも、結局開発環境の構築はつまずくものなんだなーというお気持ち
- 次回も頑張ります!
Discussion