murajun1978的パーフェクトRoR (Chapter 1) ヘ(^o^)ノ
パーフェクト Ruby on Rails 【増補改訂版】を購入したので、僕のやり方で読み進めていきます
↓ ゴニョゴニョしたコード
Chapter 1
僕のローカルPCにはrubyはいないので、Dockerで環境構築していきます
### Dockerfile FROM ruby:2.7.1-alpine3.12 WORKDIR /home/app
### docker-compose.yml
version: '3.8'
services:
ruby:
build: .
volumes:
- .:/home/app
ports:
- 3000:3000
必要最低限のDocker環境(きっとあとでゴニョります)
Dockerのコンテナにアクセスしましょ
$ docker-compose run --rm --service-ports ruby /bin/sh
Initialize
gem installが最初に書かれてますが、ぼくはbundlerおじさんなので、bunlderでinitializeします
bundlerを使ったinitializeもちゃんと書いてくれてます
$ bundle init
# Gemfile
# frozen_string_literal: true
source "https://rubygems.org"
git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
gem "rails" # コメントアウトします
んじゃ、installしましょう
/home/app # bundle install
An error occurred while installing nokogiri (1.10.10), and Bundler cannot continue.
Make sure that `gem install nokogiri -v '1.10.10' --source 'https://rubygems.org/'` succeeds before
bundling.
In Gemfile:
rails was resolved to 6.0.3.2, which depends on
actioncable was resolved to 6.0.3.2, which depends on
actionpack was resolved to 6.0.3.2, which depends on
actionview was resolved to 6.0.3.2, which depends on
rails-dom-testing was resolved to 2.0.3, which depends on
nokogiri
はい、nokogiriをコンパイルできないエラーですね
# Dockerfile FROM ruby:2.7.1-alpine3.12 RUN apk add --no-cache build-base # この行を追加 WORKDIR /home/app
↑ production用のdocker imageはおいおいやっていきます
いったん、containerから抜けて再buildしましょう
/home/app # exit $ docker-compose build
retry!
$ docker-compose run --rm --service-ports ruby /bin/sh /home/app # bundle install
いったんnokogiriがインストールできましたね!(ちょろいな)
$ bundle exec rails -v Rails 6.0.3.2
最新のRailsがインストールできました
Railsの思想
- CoC 設定より規約
- DRY 同じことを繰り返さない
- 僕はDRYって言葉がキライです。contextが違うのにDRYにしてしまうコードがあるからです。(こういうコードにはif文があったりします)
- 僕はD「RYにしよう」って言わなくて、「役割ごとに処理をまとめよう」(これでも微妙)って言ったりします。
REST
- ResouceがURLになるようにしましょ
- これができていないプロジェクトは、Routesに
get ...,post ...みたいなroutesがあることが多いです - 多分、全部Resourceで表現できるはずです。。。(多分。。。
自動テスト
Generate Rails project
アプリケーションの雛形を作っていきます
$ bundle exec rails new .
アプリ名を指定してもいいですが、僕はいつもcurrent dirに作成したいので.です
実行するとファイルをorverwriteしていいか聞かれるのでYでRails先生に従いましょう
/home/app # bundle exec rails new .
...
An error occurred while installing sqlite3 (1.4.2), and Bundler cannot continue.
Make sure that `gem install sqlite3 -v '1.4.2' --source 'https://rubygems.org/'` succeeds before bundling.
In Gemfile:
sqlite3
run bundle binstubs bundler
Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.
run bundle exec spring binstub --all
Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
rails webpacker:install
Could not find gem 'sqlite3 (~> 1.4)' in any of the gem sources listed in your Gemfile.
Run `bundle install` to install missing gems.
sqliteがないって怒られます
しょうがないのでインストールしましょう
# Dockerfile FROM ruby:2.7.1-alpine3.12 RUN apk add --no-cache build-base sqlite-dev # sqlite-devを追加 WORKDIR /home/app
containerをビルドします
/home/app # exit $ docker-compose build
containerにアクセスして、gemをインストールしましょう
$ docker-compose run --rm --service-ports ruby /bin/sh /home/app # bundle install
sqliteもインストールできましたね!
書籍ではRailsプロジェクトのディレクトリ構成を説明してくれているので、ざっと読みます
Railsの起動
それではRailsを起動してみましょう
/home/app # bin/rails s ... Please add gem 'tzinfo-data' to your Gemfile and run bundle install
tzinfo-dataをインストールしろって怒られました
素直にしたがいましょう
# Dockerfile FROM ruby:2.7.1-alpine3.12 RUN apk add --no-cache build-base sqlite-dev tzdata # tzdataを追加します WORKDIR /home/app
$ docker-compose run --rm --service-ports ruby /bin/sh /home/app # bundle install /home/app # bin/rails s ... Please run rails webpacker:install
webpackerをインストールしろと怒られました(嫌な予感。。。
/home/app # bin/rails webpacker:install sh: node: not found sh: nodejs: not found Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/
はい。node.jsをインストールしろと怒られる
# Dockerfile FROM ruby:2.7.1-alpine3.12 RUN apk add --no-cache build-base sqlite-dev tzdata nodejs # nodejsを追加 WORKDIR /home/app
どんどんdocker imageのsizeが大きくなっていくね
$ docker-compose run --rm --service-ports ruby /bin/sh /home/app # bundle install /home/app # bin/rails webpacker:install Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
yarnがインストールされてないって!
ちなみにぼくはnpm派
# Dockerfile FROM ruby:2.7.1-alpine3.12 RUN apk add --no-cache build-base sqlite-dev tzdata nodejs yarn # yarnを追加 WORKDIR /home/app
yarnがインストールできましたね
$ docker-compose run --rm --service-ports ruby /bin/sh /home/app # bundle install /home/app # bin/rails webpacker:install
こんどこそwebpackerをinstallできました!
docker buildするたびにbundle install するのめんどくさいので、あとでやっつけましょう
/home/app # bin/rails s -b 0.0.0.0

きた!
Scaffold
書籍ではtaskモデルを作成するみたいですね。やってみましょう。
/home/app # bin/rails g scaffold task content:text
invoke active_record
create db/migrate/20200727160336_create_tasks.rb
create app/models/task.rb
invoke test_unit
create test/models/task_test.rb
create test/fixtures/tasks.yml
invoke resource_route
route resources :tasks
invoke scaffold_controller
create app/controllers/tasks_controller.rb
invoke erb
create app/views/tasks
create app/views/tasks/index.html.erb
create app/views/tasks/edit.html.erb
create app/views/tasks/show.html.erb
create app/views/tasks/new.html.erb
create app/views/tasks/_form.html.erb
invoke test_unit
create test/controllers/tasks_controller_test.rb
create test/system/tasks_test.rb
invoke helper
create app/helpers/tasks_helper.rb
invoke test_unit
invoke jbuilder
create app/views/tasks/index.json.jbuilder
create app/views/tasks/show.json.jbuilder
create app/views/tasks/_task.json.jbuilder
invoke assets
invoke scss
create app/assets/stylesheets/tasks.scss
invoke scss
create app/assets/stylesheets/scaffolds.scss
作成できました!
これをDatabaseに反映しましょう
/home/app # bin/rails migrate == 20200727160336 CreateTasks: migrating ====================================== -- create_table(:tasks) -> 0.0017s == 20200727160336 CreateTasks: migrated (0.0021s) =============================
テーブルが作成されました!
Rails サーバーを起動して、画面から登録したらり、削除したりしてみましょう
/home/app # bin/rails s -b 0.0.0.0
起動したら、http://localhost:3000/tasks へアクセスしてみましょう

データの新規登録、更新、削除などいろいろ試してみてください
まとめ
以上でChapter 1は終了です。
細かい説明はすっ飛ばしましたが、こんな感じでエラーでたら対応してトライみたいな感じです。
ま、いろんなブログには正解が最初に書いてあるので、コピーするのもいいですけど、エラーメッセージをちゃんと読んで対処していくのがオススメです!
また続きを書くので、よかったら見てください!
参考にはならないかもしれませんが。。。
Enjoy パーフェクトRuby on Rails ヘ(^o^)ノ
