murajun1978的パーフェクトRoR (Chapter 1) ヘ(^o^)ノ

パーフェクト Ruby on Rails 【増補改訂版】を購入したので、僕のやり方で読み進めていきます

↓ ゴニョゴニョしたコード

github.com

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していいか聞かれるのでYRails先生に従いましょう

/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

f:id:murajun1978:20200728010115p:plain

きた!

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 へアクセスしてみましょう

f:id:murajun1978:20200728010813p:plain

データの新規登録、更新、削除などいろいろ試してみてください

まとめ

以上でChapter 1は終了です。

細かい説明はすっ飛ばしましたが、こんな感じでエラーでたら対応してトライみたいな感じです。

ま、いろんなブログには正解が最初に書いてあるので、コピーするのもいいですけど、エラーメッセージをちゃんと読んで対処していくのがオススメです!

また続きを書くので、よかったら見てください!

参考にはならないかもしれませんが。。。

Enjoy パーフェクトRuby on Rails ヘ(^o^)ノ