Open16

Rails6学習ログ

aipacommanderaipacommander

2.3 Rails開発環境の構築

$ ghq get https://github.com/oiax/rails6-compose.git
     clone https://github.com/oiax/rails6-compose.git -> /Users/kazumatamaki/ghq/github.com/oiax/rails6-compose
       git clone --recursive https://github.com/oiax/rails6-compose.git /Users/kazumatamaki/ghq/github.com/oiax/rails6-compose
# ...

$ cd rails6-compose/
$ ./setup.sh
$ docker images
REPOSITORY                           TAG                IMAGE ID       CREATED          SIZE
rails6-compose_web                   latest             62a35e8453a2   15 seconds ago   400MB
...

おk

$ docker compose up

# 別タブから
$ docker compose ps
NAME                   COMMAND                  SERVICE             STATUS              PORTS
rails6-compose-db-1    "docker-entrypoint.s…"   db                  running             5432/tcp
rails6-compose-web-1   "/bin/sh"                web                 running             0.0.0.0:3000->3000/tcp, 0.0.0.0:3035->3035/tcp

とりま起動した。

aipacommanderaipacommander

3.1.2初期ソースコードの生成

$ docker compose exec web /bin/bash
bash-4.4$ rails new baukis2 -d postgresql --skip-test-unit

# ...

yarn add v1.12.3
[1/4] Resolving packages...
[2/4] Fetching packages...
info fsevents@2.3.2: The platform "linux" is incompatible with this module.
info "fsevents@2.3.2" is an optional dependency and failed compatibility check. Excluding it from installation.
info fsevents@1.2.13: The platform "linux" is incompatible with this module.
info "fsevents@1.2.13" is an optional dependency and failed compatibility check. Excluding it from installation.
error http-proxy-middleware@2.0.6: The engine "node" is incompatible with this module. Expected version ">=12.0.0". Got "10.14.2"
error Found incompatible module
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

gemのinstallが走ったと思いきやyarnも走ってエラーだと・・・

エラー文でぐぐる。

nodeのバージョンが古いのがわるいっぽいけど、どうやって変更すればいいのだ。

aipacommanderaipacommander

全然わからん(`;ω;´)

ぐぐってもわからんのでたまたまissue覗いてみたらあった!
https://github.com/oiax/rails6-compose/issues/10

$ bash-4.4$ node -v
v10.14.2

bash-4.4$sudo apk upgrade nodej
bash-4.4$ node -v
v10.19.0

やり直し

bash-4.4$ rm -rf baukis2/
bash-4.4$ rails new baukis2 -d postgresql --skip-test-unit

# ...
error schema-utils@4.0.0: The engine "node" is incompatible with this module. Expected version ">= 12.13.0". Got "10.19.0"
error Found incompatible module
info Visit https://yarnpkg.com/en/docs/cli/add for documentation about this command.

orz

aipacommanderaipacommander

起動に少し手間をかけたのでメモ.

用意した docker-compose.yml

version: '3'
services:
  db:
    image: postgres:11.2-alpine
    volumes:
      - ./tmp/db:/var/lib/postgresql/data
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: studydb
      POSTGRES_HOST: db
  web:
    build: .
    command: bash -c "rm -f tmp/pids/server.pid && bundle exec rails s -p 3000 -b '0.0.0.0'"
    volumes:
      - .:/myapp
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: password
      POSTGRES_DB: studydb
      POSTGRES_HOST: db
$ sudo chmod -R o+w .
$ docker compose up

# 別タブ起動して
$ docker compose exec db psql -U postgres
postgres=# create database studydb;
CREATE DATABASE

これでおk

aipacommanderaipacommander

3.2.1 Gemfileの編集

# ...
# Use Active Model has_secure_password
gem 'bcrypt', '~> 3.1.7'  # コメントアウトを外す
gem 'rails-i18n'
gem 'kaminari'
gem 'date_validator'
gem 'valid_email2'
gem 'nokogiri'

# ...
group :test do
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '>= 3.26'
  gem 'selenium-webdriver', '>= 4.0.0.rc1'
  # Easy installation and use of web drivers to run system tests with browsers
  gem 'webdrivers'
  gem 'rspec-rails'  # 追加
  gem 'factory_bot_rails'  # 追加
end

# ...
$ docker compose exec web /bin/bash
root@7980dcb408ba:/myapp# ./bin/bundle
aipacommanderaipacommander

3.4 データベースのセットアップ

$ docker compose exec web ./bin/rails db:create
Running via Spring preloader in process 100
Database 'studydb' already exists
Created database 'myapp_test'

なるほど。。。DB作成するコマンドがあったのか。。。(あとDB名修正しなきゃ)

aipacommanderaipacommander

4.1.3 RSpecの初期設定

$ docker compose exec web ./bin/rails g rspec:install
Running via Spring preloader in process 50
      create  .rspec
      create  spec
      create  spec/spec_helper.rb
      create  spec/rails_helper.rb

spec.rbファイルを用意してテスト実行.

$ docker compose exec web rspec spec/experiments/string_spec.rb
.

Finished in 0.04792 seconds (files took 0.23563 seconds to load)
1 example, 0 failures

4.2 エグザンプル

なぜRSpecはそれをエグザンプルと呼ぶのでしょうか。それは、ビヘイビア駆動開発では、テストコードによってソフトウェアの仕様(specification)が定義される、と考えるからです。RSpecという名前もそこに由来しています。RSpecは単にソフトウェアのテストをするだけでなく、ソフトウェアの仕様を記述することに重点を置いています。ある意味では、テストコードが仕様書の代わりになるのです。仕様は言葉で表現するよりも、実際の用例を列挙した方がわかりやすいものです。
引用: 黒田 努. Ruby on Rails 6 実践ガイド (impress top gearシリーズ) (Japanese Edition) (pp.68-69 Kindle 版.

なるほど

aipacommanderaipacommander

describe "#<<" do#<< って何???

# はインスタンスメソッドで、 << はシフト演算かpushらしいけどよくわっていないです。

aipacommanderaipacommander

RspecはJestとかCypressに似ているので(どっちが先発後発かわからんけど)ぼくは読みやすい

aipacommanderaipacommander

5.1.1 ルーティングの設定

  • root controller#action rootは / のこと
  • root "top#index" TopController で、namespace(名前空間)がstaffなので Staff::TopController というクラスを指すことになるらしい。Staffはモジュール(Rubyのモジュールかな?)
aipacommanderaipacommander

5.1.2 コントローラーとアクションの作成

railsにもartisanコマンドみたいのがあるっぽい。

$ docker compose exec web ./bin/rails g controller staff/top
Running via Spring preloader in process 92
      create  app/controllers/staff/top_controller.rb
      invoke  erb
      create    app/views/staff/top
      invoke  rspec
      create    spec/requests/staff/top_spec.rb
$ docker compose exec web ./bin/rails g controller admin/top
Running via Spring preloader in process 122
      create  app/controllers/admin/top_controller.rb
      invoke  erb
      create    app/views/admin/top
      invoke  rspec
      create    spec/requests/admin/top_spec.rb
$ docker compose exec web ./bin/rails g controller customer/top
Running via Spring preloader in process 152
      create  app/controllers/customer/top_controller.rb
      invoke  erb
      create    app/views/customer/top
      invoke  rspec
      create    spec/requests/customer/top_spec.rb
aipacommanderaipacommander

とりあえず生成されたcontrollerにactionメソッド足して、viewを作成して画面で確認中。

Complete が表示されて数十秒待機してた。

表示された!

aipacommanderaipacommander

ここまでSCSSなので、経験がある身としては特に面白みもなく作業をこなした。

5.3.2 productionモード用のデータベース作成

$ docker compose exec web ./bin/rails db:create RAILS_ENV=production
/usr/local/bundle/gems/spring-4.0.0/lib/spring/application.rb:101:in `block in preload': Spring reloads, and therefore needs the application to have reloading enabled.
Please, set config.cache_classes to false in config/environments/production.rb.
 (RuntimeError)

https://qiita.com/taki_21/items/b44dffc1eb13b172eb18

上記記事の通りに対応したら修正できた。