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^)ノ