Rails6学習ログ
これで学ぶ。
僕の今のれべる
- PHPでWebフレームワーク(MVC)とかを覚えた
- Laravelはかじってる
- Rubyはほぼ初心者(仕事で使ったことあるけどガッツリ書いたことはない)
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
とりま起動した。
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も走ってエラーだと・・・
エラー文でぐぐる。
- https://qiita.com/guri_tech/items/f870ff52dce3a39e2d23
- https://qiita.com/asami___t/items/3341dc743bd8d999a08e
nodeのバージョンが古いのがわるいっぽいけど、どうやって変更すればいいのだ。
全然わからん(`;ω;´)
ぐぐってもわからんのでたまたまissue覗いてみたらあった!
$ 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
むきー!動かないので諦めた。
諦めたので下記記事を参考にしました。
インストールに成功した!!!!
起動に少し手間をかけたのでメモ.
用意した 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
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
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名修正しなきゃ)
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 版.
なるほど
謎
describe "#<<" do
の #<<
って何???
#
はインスタンスメソッドで、 <<
はシフト演算かpushらしいけどよくわっていないです。
RspecはJestとかCypressに似ているので(どっちが先発後発かわからんけど)ぼくは読みやすい
5.1.1 ルーティングの設定
-
root controller#action
rootは/
のこと -
root "top#index"
TopController
で、namespace(名前空間)がstaffなのでStaff::TopController
というクラスを指すことになるらしい。Staffはモジュール(Rubyのモジュールかな?)
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
とりあえず生成されたcontrollerにactionメソッド足して、viewを作成して画面で確認中。
Complete
が表示されて数十秒待機してた。
表示された!
ここまで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)
上記記事の通りに対応したら修正できた。