2020.8.7の学習ノート2
◆書籍
初学書を終わらせたので、中級書籍を実施。
これの内容をマスターすればrailsプロ名乗れると、amazonに記載ある良書
◆目次
- 環境構築
- Railsアプリケーションの新規作成
- テスト環境の構築
- 仮設トップページの作成
- エラー画面の作成
- ログイン/ログアウト機能の実装
- ルーティング
- 管理者が職員のアカウント情報を変更する機能の実装
- Strong Parameterによるセキュリティ強化
- アクセス制御の仕組み
- 管理者が職員のログイン/ログアウトを監視する機能
- 職員が自分のパスワードを変更する機能
- フォームプレゼンターを用いたソースコードの改善
- 職員が顧客アカウントを追加・編集・削除する機能の実装
- 職員が顧客の電話番号を追加・編集・削除する機能の実装
◆動作環境
- Ruby2.6
- Ruby on Rails6.0
- PosgreSQL 11
- Linux系
◆開発環境の構築
仮想環境を使う理由
本当のアプリ開発を行うときの課題。作業マシンと実運用の環境が異なること。
環境とは、OSの種類・バージョン、ソフトウェアやライブラリの種類とバージョン。
これらの問題の単純な解決法は、作業マシンとプロダクトマシンの環境を一致させることです。しかし、それはOSを変更し、プロダクションマシンにログインしてVimでコードを書き換えて開発することになります。
そこででてくるのが仮想環境というオプションである。デスクトップOSの上に仮想的な環境を構築し、そこにLinuxベースのServerOSをインストールするのです。
開発中のアプリケーションは仮想環境で動作させます。そして、デスクトップOSのWebブラウザからアプリにアクセスして動作を確認します。他方アプリのソースコードは「共有フォルダ」の機能によって、デスクトップOSで開いて編集します。
Dockerとは
仮想環境を提供するオープンソフトです。設定の容易さと起動の速さで人気があります。
個々の仮想環境をコンテナとよびます。コンテナの中身はDockerfileと呼ばれるテキストファイルで記述されます。このファイルがあればさまざまなOS上でコンテナを復元できます。
Docker Composeとは
Dockerを用いてRailsアプリを開発したり、プロダクト環境で動かすとき、アプリケーションサーバとデータベースサーバを別々のコンテナで構築するのが一般的です。Docker Composeはこれらの複数のコンテナをまとめて起動・停止するためのツールです。後述しますがdocker-compose upというコマンド一つ実行するだけで、Webアプリケーションを構築するコンテナ群が動き出します。
Docker/Docker Composeのインストール
Ubuntu
-古いDocker Engineをアンインストール
sudo apt-get remove docker docker-engine docker.io contained runc
-パッケージ情報を更新
sudo apt-get update
-次のコマンドを実行
sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
-Dockerの公式GPG鍵を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
※ここでエラー出たらこれ実行
※ここでエラー出たらこれ実行
-次のコマンドを実行
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
-再度パッケージ情報を更新
sudo apt-get update
-Docker Engine と Docker Composeをインストール
sudo apt-get install docker-ce docker-ce-cli containerd.io
sudo apt-get install docker-compose
-現在ログインしているユーザでdockerコマンドを実行できるようにする
sudo usermod -aG docker $(whoami)
最後にバージョン番号を確認
docker --version
docker-compose --version
-ログアウトして,再ログインする
Rails開発環境の構築
Gitのインストール
sudo add-apt-repository ppa:git-core/ppa
sudo apt-get update
sudo apt-get install git
Rails開発用コンテナ群の構築
git clone https://github.com/oiax/rails6-compose.git
cd rails6-compose
./setup.sh
※Ubuntuの再起動方法について
※エラー:
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
※Ubuntuの再起動方法について
※エラー:
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.
→この記事を参考に
※docker daemonの公式ドキュメント
rootにて$ sudo docerd
※エラー:perhaps iptables or your kernel needs to be upgraded.
※ここでのエラーはあとでUbuntu18.04で再度トライする
→今は先に進む
$ sudo service docker start
* Docker is running
※docker daemonの公式ドキュメント
rootにて$ sudo docerd
※エラー:perhaps iptables or your kernel needs to be upgraded.
※ここでのエラーはあとでUbuntu18.04で再度トライする
→今は先に進む
コンテナ群の起動と停止
docker-compose up -d
docker-compose stop
開発プロジェクト始動
新規Railsアプリケーションの作成
webコンテナへのログイン
→これは後回し
初期ソースコードの生成
dockerではなくWindows環境でRails実装を行う
rails new baukis -d postgresql --skip-test-unit
-データベースをポスグレ
-test-unitはインストールしない
※もし、rails new でGemfileを抜かしたい場合、--skip-bundleを付す
Gemパッケージのインストール
Gemfileの編集
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.6.6'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3', '>= 6.0.3.2'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
# gem 'image_processing', '~> 1.2'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
# Access an interactive console on exception pages or by calling 'console' anywhere in the code.
gem 'web-console', '>= 3.3.0'
end
group :test do
# Adds support for Capybara system testing and selenium driver
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
# Easy installation and use of web drivers to run system tests with browsers
gem 'webdrivers'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
不要な下記を削る(->今回はWinなのでやはり削らない)
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
そして、下記を足す
gem 'bootsnap', '>= 1.4.2', require: false
gem "bcrypt"
gem "rails-i18n"
gem "kaminari"
gem "date_validator"
gem "valid_email2"
gem "nokogiri"
group :development, :test do
RSpecのGemパッケージも組み込む
gem 'webdrivers'
gem 'rspec-rails'
gem 'factory_bot_rails'
end
bin/bundleコマンドの実行
source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.6.6'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.3', '>= 6.0.3.2'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 4.1'
# Use SCSS for stylesheets
gem 'sass-rails', '>= 6'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
# gem 'image_processing', '~> 1.2'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
# Access an interactive console on exception pages or by calling 'console' anywhere in the code.
gem 'web-console', '>= 3.3.0'
end
group :test do
# Adds support for Capybara system testing and selenium driver
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
# Easy installation and use of web drivers to run system tests with browsers
gem 'webdrivers'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'bootsnap', '>= 1.4.2', require: false
gem "bcrypt"
gem "rails-i18n"
gem "kaminari"
gem "date_validator"
gem "valid_email2"
gem "nokogiri"
group :development, :test do
gem 'webdrivers'
gem 'rspec-rails'
gem 'factory_bot_rails'
end
Gemパッケージのインストールをします
bin/bundle
インストール完了で,
ディレクトリにGemfile.lockというファイルが生成される
bin/bundle list
でアプリが利用するGemパッケージのリストが表示できる
JavaScriptパッケージのインストール
JavaScriptパッケージインストールにはyarnコマンドをうつ。
yarnコマンドは、実行時にyarn.lockファイルの有無を調べて、なければpackage.jsonファイルの中身を見て、必要なパッケージ群をインストールして、インストールしたパッケージのリストとバージョン番号をyarn.lockファイルに書き込みます。
JavaScriptパッケージをupdateしたいときは、yarn upgradeをうちます。
データベースのセットアップ
database.ymlの編集
config/database.ymlを開いて編集する
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: db
username: postgres
password: ""
データベースの作成
# For details on connection pooling, see Rails configuration guide
# https://guides.rubyonrails.org/configuring.html#database-pooling
pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
host: db
username: postgres
password: ""
次のコマンドを実行して、データベースを作成する
bin/rails db:create
※エラーdb:hostにしてエラーが出たので、
対処としてhost: localhostにて対処した。
→明日対処すること!
その他準備作業
ドキュメントの整備
Readme.mdにアプリケーションの基本的な情報を書く。
記述すべき情報は例えば以下のようなものです。
- アプリケーションの簡単な説明
- 推奨されるシステム環境
- インストールの手順
- データベース初期化の手順
- テストの実行手順
アプリケーションルートの下に、MIT-LICENSE.txtを配置すること
タイムゾーンとロケールの設定
config/application.rb
・シングルクォートをすべてダブルクォートに置換する
require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)
module Baukis
class Application < Rails::Application
config.load_defaults 6.0
end
end
・timezone/localeを付与する
require_relative "boot"
require "rails/all"
Bundler.require(*Rails.groups)
module Baukis
class Application < Rails::Application
config.load_defaults 6.0
end
end
config.load_defaults 6.0
config.time_zone = "Tokyo"
config.i18n.load_path +=
Dir[Rails.root.join("config","locales","**","*{rb,yml}").to_s]
config.i18n.default_locale = :ja
ロケールファイルの情報を再帰的に取り込んでjaに設定する
config.load_defaults 6.0
config.time_zone = "Tokyo"
config.i18n.load_path +=
Dir[Rails.root.join("config","locales","**","*{rb,yml}").to_s]
config.i18n.default_locale = :ja
ジェネレータの設定
ジェネレータが親切すぎるので設定を変更する。初期構築をfalseにする。
config.generators do |g|
g.skip_routes true
g.helper false
g.assets false
g.test_framework :rspec
g.controller_specs false
g.view_specs false
end
hostsファイルの設定
config.generators do |g|
g.skip_routes true
g.helper false
g.assets false
g.test_framework :rspec
g.controller_specs false
g.view_specs false
end
三種類のユーザごとにトップページURLが変更。そのためにはlocalhostに相当する127.0.0.1にexample.com/baukis2.example.comを設定する。
ホストOS側で設定すること。hostsというファイルを管理者で編集すること
\windows\system32\drivers\
Ubuntu] /etc/
127.0.0.1 example.com baukis2.example.com
Blocked Hostsの設定
ブラウザがRailsアプリにアクセスする際にホスト名を制限するものです。
デフォルトではlocalhostのみ許可されているので、上記二つをホワイトリストに登録する
Rails.application.configure do
config.hosts << "example.com"
config.hosts << "baukis2.example.com"
end
web-consoleの設定
Rails.application.configure do
config.hosts << "example.com"
config.hosts << "baukis2.example.com"
end
debagツールですが、127.0.0.1しか受け付けない設定なのでDocker => hostOSのアクセス状態でコンソールが応答しない。これを回避するため、config/enviormentsのdevelopment.rbを書き換える
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.web_console.whitelisted_ips = ["172.16.0.0/12"]
end
172.16.0.0/12は172.16.0.0~172.31.255.255までのアドレス範囲の指定
アプリケーションの動作確
# Use an evented file watcher to asynchronously detect changes in source code,
# routes, locales, etc. This feature depends on the listen gem.
# config.file_watcher = ActiveSupport::EventedFileUpdateChecker
config.web_console.whitelisted_ips = ["172.16.0.0/12"]
end