Hit the books!!

プログラミング学習記録

「Ruby on Rails6 実践ガイド」勉強メモ(No.1)

はじめに

FJORD BOOT CAMPRuby on Railsの学習に入ったのが9月。Railsのプラクティスの内容はこのようになっております↓

f:id:ud_ike:20201119222711p:plain

11月がおわろうとしている現在、「omniauthを使ってGitHub認証を実装する」の課題に取り組んでいるところ。

今の悩み

Railsのことまだよくわかってない...」という漠然とした悩みを抱えています。課題を進めていく上でなんとなく少しずつ理解していく、というのもあるけど(今までそれでやってきた)、完了すると苦労したのにほとんど覚えてないなぁ、ということばかりで、、、もっと頭に入れたいなあという気持ち。

Railsの学習をはじめてからこれまで

これまで3冊の本を買った。(読破したとは言ってない)

最初に買ったのが上の2冊。どちらも初心者向けではないことを知らずに手をつけた。結果、どちらも途中まで読んだという中途半端な感じに。

フィヨルドの課題のi18nとkaminariまではなんとなくでクリアできるんだけど、deviseからはもうちょっと理解していないとこれはキビシイぞ...ということに気づく。

で、初心者におすすめな本を聞いて「独習Rails」を買った。このブログでもこれまでにこの本の内容をまとめた記事を書いた。

この3冊については私が読みはじめたとは全く逆の、独習Rails→パRails→現場Railsの順番がよかったみたい。

独習Railsはとばしてる部分もあるけど前の2冊に比べるとやはり読みやすかった。そしていっぱい修正したけどなんとかdeviseでユーザー認証を実装する課題もOKが出た。

しかしRailsのことまだ何も理解してないんじゃないか...というモヤモヤした気持ちが消えることはなく、解消方法を考えた結果、4冊目の本を買った。

Rails実践ガイド」のひとり読書会をやるぞ

book.impress.co.jp

じゃん。これにした。

  • 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ファイルをいじってホスト名を設定したのもはじめてだった。