「Ruby on Rails6 実践ガイド」勉強メモ(No.1)
はじめに
FJORD BOOT CAMPでRuby on Railsの学習に入ったのが9月。Railsのプラクティスの内容はこのようになっております↓
11月がおわろうとしている現在、「omniauthを使ってGitHub認証を実装する」の課題に取り組んでいるところ。
今の悩み
「Railsのことまだよくわかってない...」という漠然とした悩みを抱えています。課題を進めていく上でなんとなく少しずつ理解していく、というのもあるけど(今までそれでやってきた)、完了すると苦労したのにほとんど覚えてないなぁ、ということばかりで、、、もっと頭に入れたいなあという気持ち。
Railsの学習をはじめてからこれまで
これまで3冊の本を買った。(読破したとは言ってない)
- 「現場で使えるRuby on Rails5速習実践ガイド」(「現場Rails」)
- 「パーフェクトRuby on Rails【増補改訂版】」(「パRails」)
- 「独習Ruby on Rails」(「独習Rails」)
最初に買ったのが上の2冊。どちらも初心者向けではないことを知らずに手をつけた。結果、どちらも途中まで読んだという中途半端な感じに。
フィヨルドの課題のi18nとkaminariまではなんとなくでクリアできるんだけど、deviseからはもうちょっと理解していないとこれはキビシイぞ...ということに気づく。
で、初心者におすすめな本を聞いて「独習Rails」を買った。このブログでもこれまでにこの本の内容をまとめた記事を書いた。
この3冊については私が読みはじめたとは全く逆の、独習Rails→パRails→現場Railsの順番がよかったみたい。
独習Railsはとばしてる部分もあるけど前の2冊に比べるとやはり読みやすかった。そしていっぱい修正したけどなんとかdeviseでユーザー認証を実装する課題もOKが出た。
しかしRailsのことまだ何も理解してないんじゃないか...というモヤモヤした気持ちが消えることはなく、解消方法を考えた結果、4冊目の本を買った。
「Rails実践ガイド」のひとり読書会をやるぞ
じゃん。これにした。
- Baukis2という企業向け顧客管理システムの開発を通じて学習が進められている
- この本はDockerを使っているが、使ったことがなくてそっちに時間をとられそうなので使わない
この本を、時間はかかってもなるべく丁寧に読み進めることでRailsの理解を深めたい所存。いつおわるかわからんけど。フィヨルドの課題を進めるほうが優先なので、課題提出してレビューの合間などをみて少しずつやっていこうと思う。
さっそくChapter3あたりからいってみよう。
アプリケーションを生成する
% rails new baukis2 -d postgresql --skip-test-unit
を実行。
テストフレームワークとしてTest::Unitの代わりにRSpecを使用するためTest::Unit関連のコードの生成をskipした。
Gemのインストール
Gemfileを追記する。
gem 'bcrypt' gem 'rails-i18n' gem 'kaminari' gem 'date_validator' gem 'valid_email2' gem 'nokogiri'
bcryptはパスワードの暗号化で使用する。nokogiriはXML/THMLの解析・生成のためのパッケージ。
RSpecで使うGemを追記。
group :test do gem 'capybara', '>= 2.15' gem 'selenium-webdriver' gem 'webdrivers' gem 'rspec-rails' # 追記 gem 'factory_bot_rails' # 追記 end
% bin/bundle
する。
JavaScriptパッケージ群のインストール
yarn
コマンドでJavaScriptパッケージをインストールできるが、rails new
コマンドを実行した際にこのコマンドも実行されているため"すでに最新状態です"というメッセージが出る。
yarnコマンドは、yarn.lockファイルの有無を調べ、なければpackage.jsonファイルの中身を見て必要なパッケージ群をインストールする。インストールしたパッケージのリストとバージョン番号がyarn.lockファイルに書き込まれる。
データベースを作成する
config/database.yml
を編集する。
default: &default adapter: postgresql encoding: unicode # 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: localhost # 追記 username: postgres # 追記 password: '' # 追記
bin/rails db:create
を実行する。
% bin/rails db:create Created database 'baukis2_development' Created database 'baukis2_test'
config/database.yml
の追記内容で、本にはhost: db
とあってそのままdb:create
したらエラーになった。調べてhost: localhost
に修正したらうまくいった。
PostgreSQLのデフォルトのホスト名がlocalhostだからということで納得した。
README.mdの修正とライセンス文書の作成
README.mdファイルに記述すべき情報は以下があげられる。
- アプリケーションの簡単な説明
- 推奨されるシステム環境
- インストール手順
- データベース初期化の手順
- テストの実行手順
ライセンス文書はアプリケーションのルートディレクトリ直下に作成する。
Baukis2はMITライセンスを採用するのでMIT-LICENSE.txtというファイルを作成しよう。(内容例については省略)
タイムゾーンとロケールの設定
config/application.rb
はアプリケーションの設定を記述するファイル。以下のように変更する。
require_relative 'boot' require 'rails/all' Bundler.require(*Rails.groups) module Baukis2 class Application < Rails::Application 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 end end
11行目では時刻を日本時間で表示するためのタイムゾーンを東京に設定している。
12~13行目ではロケールファイルのロードパスを設定している。config/localesディレクトリ以下を再起的に読み込む設定にしている。14行目はデフォルトロケールを日本語にセットしている。
クラスメソッドconfigはRails::Application::Configurationオブジェクトを返す。このオブジェクトを通じてRailsアプリケーションの各種設定を変更することができる。
参考:Rails アプリケーションを設定する - Railsガイド
ジェネレータの設定
Railsにはソースコードの雛形を生成するジェネレータという機能がある。便利だが常に必要であるわけではないアセットファイルやヘルパーなども生成するため親切すぎる面もある。
config/application.rbを変更すれば、ジェネレータによるソースコードの生成をoffにすることができる。
(省略) module Baukis2 (省略) 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 end end
テストフレームワークを標準のmini_testからRSpecに変更している以外は全てジェネレータによるソースコードの生成をoffにする設定である。 必要に応じて設定しよう。
hostsファイルの設定
顧客管理システムBaukis2の仕様では、3種類の利用者(職員、管理者、顧客)ごとのトップページを別々のURLに設定できる、というものがある。この使用をふまえて開発を進めるには、仮想マシン上で動いているRailsアプリケーションに特定のホスト名でアクセスする必要がある。
そこでlocalhostに相当する127.0.0.1というIPアドレスにexample.comとbaukis2.example.comという2つのホスト名を設定することにする。
作業はOS側で行う。hostsというファイルを編集することで設定できる。
macの場合、hostsファイルは/private/etcディレクトリにある。/privateは非表示になっており、hostsファイルは管理者権限でないと書き込みができない。
## # Host Database # # localhost is used to configure the loopback interface # when the system is booting. Do not change this entry. ## 127.0.0.1 localhost 127.0.0.1 example.com baukis2.example.com # 追記 255.255.255.255 broadcasthost ::1 localhost
Blocked Hostsの設定(Rails6の新機能)
ブラウザがRailsアプリケーションにアクセスする際に使用できるホスト名(ドメイン名)を制限するためのものである。デフォルトではlocalhostのみが許可されている。
ここではexample.comとbaukis2.example.comという2つのホスト名を使用するため、これらをホワイトリストに登録する。
config/initializersディレクトリにblocked_hosts.rbというファイルを作成し、次の内容で保存する。
Rails.application.configure do config.hosts << 'example.com' config.hosts << 'baukis2.example.com' end
ホスト名の制限が不要であれば、config.hosts = nil
と設定してBlocked Hostsを無効にしよう。
web-consoleの設定
web-consoleとはRails用のデバッグツールでGemfileに最初から入っている。
ただし、初期状態では127.0.0.1からのアクセスしか受け付けないようになっているため、Docker環境でRailsアプリケーションを動かしてホストOS側のブラウザでアクセスすると応答しない。
この問題を回避するため、config/environmentsディレクトリにあるdevelopment.rbの最後に追記する。
(省略) config.web_console.whitelisted_ips = [ '172.16.0.0/12' ] # 追記 end
172.16.0.0/12は172.16.0.0~172.31.255.255までのアドレスの範囲を示す。
アプリケーションの起動
% bin/rails s
Dockerを使ってwebコンテナ側で起動する場合は% bin/rails s -b 0.0.0.0
と-bオプションを指定しよう。デフォルト値は127.0.0.1になっており、コンテナの外(ホストOS側のブラウザ)からアクセスできないため。0.0.0.0を指定するとすべてのIPアドレスからのアクセスに応答するようになる。
ブラウザでhttp://example.com:3000/とhttp://baukis2.example.com:3000/にアクセスしてみると、どちらも初期状態のページが表示される。
3000はRailsのデフォルトのポート番号。
今回はここまで。次回はPartⅡ(Chapter4)から!
感想
やっとChapter3まで終わった。まだ準備段階なのに新しく知ることも多くて時間がかかってしまった...
- READMEをちゃんと書こう。フィヨルドの課題提出のときにちゃんと書いてなかった。
- hostsファイルをいじってホスト名を設定したのもはじめてだった。