いよいよ本格的に何か作ろうと思いまして、まずは開発環境で、Rails6の環境構築を終了しました。
ちなみに参考にした記事は、
・DockerでRuby on Railsの環境構築を行うためのステップ【Rails 6対応】 - Qiita
その他、上手くいかなかった部分には、
・Rails6+MySQL+Nginx+Unicorn+Docker環境構築メモ - Qiita
・PostgreSQL(Docker)にRails(Docker)が接続できなくなったから調べてみた。(could not translate host name "db" to address: Name or service not known) - Qiita
上記の記事を参考にさせていただきました。
そして、今回は初歩中の初歩で少し躓いたのでその話を少しします。
早速Webサイトのトップページを作ろう!
railsでトップページを作ろうと思い、
$ rails g controller home top
と入力、
すると...
Rails is not currently installed on this system. To get the latest version, simply type:
$ sudo gem install rails
Google翻訳の力を借りるとこう↓
Railsは現在このシステムにインストールされていません。最新バージョンを入手するには、$ sudo gem install railsを入力してね。
う〜ん、Rails6は間違いなくインストールしているのに何ででしょうか?
0.5秒くらい悩みましたが答えは簡単でした。
Railsが存在するのは、あくまでDocker内だけでの話
まず、Dockerとは?
Docker(ドッカー)は、__コンテナ仮想化__を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである。
Dockerはコンテナ仮想化を用いたOSレベルの仮想化(英語版)によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード(イメージ)として管理可能にする。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる。
引用:Docker - Wikipedia
wikipediaを見てもらっても分かる通り、Dockerって仮想化技術なんですね。
つまりdocker-composeを使ってRailsをインストールしていますが、__あくまでもDocker内で使用出来るようになったよ!__くらいの認識で良い訳です。
なので、__Railsは現在このシステムにインストールされていません。最新バージョンを入手するには、$ sudo gem install railsを入力してね。__となったんですね!
解決策は、Dockerコマンド
$ docker-compose run web
これが魔法の呪文です。
この後に、さっきのコマンドを追加したら...
$ docker-compose run web rails g contoller home top
Starting guminoki_db_1 ... done
Could not find generator 'contoller'. Maybe you meant "controller"?
Run `rails generate --help` for more options.
これは、どうもcontrollerを誤字ってるみたいなのでやり直し。
$ docker-compose run web rails g contoroller home top
Starting guminoki_db_1 ... done
create app/controllers/home_controller.rb
route get 'home/top'
invoke erb
create app/views/home
create app/views/home/top.html.erb
invoke test_unit
create test/controllers/home_controller_test.rb
invoke helper
create app/helpers/home_helper.rb
invoke test_unit
invoke assets
invoke scss
create app/assets/stylesheets/home.scss
無事、完了しました!
やったね!
さいごに
以前、Djangoでアプリケーションを作成するときにも__$ docker-compose run web__を使っていました。すっかりど忘れしていましたね(汗)
$ docker-compose run web python3 manage.py runserver
更に、
$ docker-compose run --rm web rails g contoroller home top
の様に、__--rm__オプションを付けると、コンテナ終了時に自動的にコンテナ削除をしてくれるので、とても便利だったりします。