パーフェクトRuby on Rails
購入した本についてまとめる
railsとは
Rackの仕様に則ったRackアプリケーション
gemコマンドとは
Rubyをインストールすると一緒にインストールされるコマンド。 gemコマンドではRubyで扱う配布用ライブラリであるgemパッケージの管理が行える。
各gem
# install
gem install
# uninstall
gem uninstall
rakeコマンド
※現在のrailsではRakeタスクもrailsコマンドから実行できるようになったため直接rakeコマンドを使う頻度は少なくなった。
Rubyをインストールすると一 緒にインストールされるコマンド。 rakeコマンドはmakeコマンド風にタスクを実行するためのタスクランナーで、実行する処理をRakeタスクと呼ぶ。 アプリケーションを起動せず、行いたい処理をCUI(コマンドプロンプトやターミナル)から実行するのに利用がある。 参考URL
rakeコマンドはデフォルトでカレントディレクトリ内のRakefileというファイルを参照する。
bundleコマンド
Rubyをインストールすると一緒にインストールされるコマンド。
※bundleコマンドはRuby2.5から本体に組み込まれたため2.5以降別途インストールは不要
gemパッケージの仕組みを利用して、開発しているプロジェクト内でどのgemパッケージを使っているのか、そしてどのバージョンを利用しているのかを明示する仕組みを提供する。
Bundlerを使って使用するgemパッケージをまとめるには Gemfile
という設定ファイルにgemパッケージ名を記載する。
そしてstepGemfileに記載されているgemパッケージのバージョンや依存関係を解決した結果をGemfile.lockとして保存する
Bundlerでよく利用するサブコマンド
# Gemfile(.lock)に書かれているgemパッケージをインストールする
bundle install
# インストール済みのgemパッケージのバージョンを更新する
bundle update [ライブラリ名]
# インストール済みのgemパッケージの一覧を表示する
bundle list
# Gemfileを生成する
bundle init
# Bundlerでインストールされているgemパッケージを使用してコマンドを実行する。
# bundle execを実行コマンドの前につけなかった場合、グローバルのgemが適用される。
bundle exec [コマンド名]
gemがローカルインストールされているか確認
$ gem list | grep mechanize # グローバルインストールされているgem一覧
$ bundle exec gem list | grep mechanize # ローカルインストールされているgem一覧
mechanize (2.7.6)
- Tips globalにgemをインストールする
globalにインストールされているgemを確認する
$ gem environment
- INSTALLATION DIRECTORY: /home/ubuntu/.rbenv/versions/3.1.2/lib/ruby/gems/3.1.0
で確認 INSTALLATION DIRECTORYの項目
Bundlerを使って管理する
Bundlerでライブラリを管理するためにはGemfileを作成する必要がある。
# Gemfile作成
bundle init
Gemfile内にコメントアウトされている行はコメントアウトを外し bundle install
をすると bundle exec rails -v
ができる
Gemfileに必要なgemを記載しておくことで、特定のプロジェクトでのみ利用するgemを簡単に管理できる。 Railsではプロジェクトの雛形を作成すると自動的にGemfileが作成される
Rails思想
Railsは以下の4つの思想を強く打ち出しています。
- CoC(Convention over Configuration)
- DRY(Don't Repeat Yourself)
- REST(Representational State Transfer)
- 自動テスト
CoC(Convention over Configuration)
設定より規約という意味。
規約に従うことでプログラム内に規律が生まれる
- データベースのテーブル名はモデル名の複数形にする(モデル名がEmployeeの場合、テーブル名はemployeesとなる)
- /employeesというURLは社員の一覧を表す
- 社員ID: 1の 社員情報を表すURLは
/employees/1
である。
このような規約に従うことでそれぞれのコンポーネントに紐付けを行う作業を省略できる。
- 多くの設定ファイルを書く必要がない
- 共通のルールがあることで他のエンジニアとスムーズなコミュニケーションが取れる
規約に従うことで関心ごとがシンプルになり、本来注力すべきビジネスロジックへ集中できるようになる。
設定ファイル(config)などを作るより規約を設けたほうが早いという意味。
Rails ディレクトリについて
bin/
Railsアプリケーションを開発するために利用する実行コマンドを格納しているディレクトリ
通常Bundlerを使って依存関係を解決している場合、その依存関係を解決した上で実行するために $ bundle exec rails
のように exec
をつける。しかしRailsでは利便性や一貫性のため bundle exec
をつけなくても実行できるコマンドをbin/に用意している。
→このようなファイルをbinstubと呼ぶ
もしRailsプロジェクト内で新たなコマンドを利用する場合はyarnなどの例に倣ってbinディレクトリ内に実行用ファイルを用意しておくと一貫性があり、途中から参画したメンバーにもわかりやすいプロジェクト構成になる。
config/
アプリケーションの動作に関する設定ファイルを格納するディレクトリ
lib/
Rakeタスクなどアプリケーションから独立したコードを格納するディレクトリ。 ※Rails6.0ではAutoloadの機能自体がZeitwerk置き換えられたこともある傾向からlibディレクトリにアプリケーションから利用するコードを置くことは推奨されていない
app
RailsがMVCアーキテクチャを採用しているためアプリケーションコードは基本的にModel, View, Controllerの3階層に分かれる
helpers/はViewで利用するヘルパースクリプトになる。
railsコマンド
Rubyをインストールしたらgemコマンドが入るため、gemでrailsをインストールするとrailsコマンドが使える。
generateコマンド
Railsが提供するgenerateコマンドの中には、データの更新や削除などのテンプレートをひととおり生成するscaffoldという機能がある。
- generate scaffold scaffold : 足場 このscaffoldは指定したテーブルに対してのCRUD操作を行うMVCそれぞれのコードと、テストやデータベースのテーブル定義を行うmigrationファイルなどが生成される。
DB操作
-
migration実行
rake db:migrate
を実行すると最初にschema_migrationsというテーブルを参照しmigration IDを確認する。 そして実行されていないmigrationを検知すると未適用のmigrationファイルを実行しmigration IDを記録する。 そのためrake db:migrate
を複数回実行しても、実行のたびにCREATE TABLE文が実行されることはない。 -
migration ID確認(schema_migrationsテーブル確認)
rake db:migrate:statusP
というタスクを実行する。
Rails URL設計の確認
確認する方法は2つある。
- developmentで動作している時に
http://localhost:3000/rails/info/routes
へ確認する - デフォルトで定義されているrakeタスクを実行
rails routes
GET → show POST → create UPDATE → put DELETE → destroy
2章
モデリングとは
あるシステムを作るということは、そのシステムが解決する問題に対して必要な概念を探して、それに対して名前をつけたり、相互の関係性を整理したりすることと言っても過言ではない。
MVCアーキテクチャ
M=Model
データベースとの接続とデータに対する操作、およびビジネスロジック
V=View
Modelの内容を参照し視覚表現を行う部分
C=Controller
Modelのロジックを呼び出し、必要なViewの選択などModelとViewをつなぐ部分
ActiveRecordでのmodel
ActiveRecordによるモデルには、大きく分けて2つの側面がある。
1つはデータベースと接続し、データベースのレコードとActiveRecordオブジェクトを結びつけるという役割。
上記のようにモデルクラスの実装に何も記述しなくとも、テーブルのカラム情報を取得し、モデルのフィ ールド情報に自動で反映する機能は、ActiveRecordを大きく特徴付ける機能の1つです。
その他にも、SQLの構築を抽象化する機能やコネクションプール、接続情報を隠蔽する機能を提供します。もう1つは、よりビジネスロジックの実装的な振る舞いに関するところ、すなわちバリデーションや、レコード保存時などに実行するさまざまなコールバックなどを実行する役割
- modelに何も記述しなくても勝手にdbからのカラムをモデルに反映させる。
Query interface
ActiveRecord::Relationインスタンスを返すやつであればメソッドチェーンで処理を繋げられること。
このように設計されている理由としては、ActiveRecord::Relationによって検索に必要な情報だけを返すことで、クエリの構築をメソッドチェインで簡潔に記述できます。また、実際のSQLは最初に操作が必要になったタイミングではじめて発行されるため、必要以上にデータベースとの通信が発生してしまうことを抑制する効果もある。
任意の箇所でSQLを発行したい
to_a
メソッドで即座にSQLを発行するテクニック