銀行員からのRailsエンジニア

銀行員からのRailsエンジニア

銀行員から転身したサービス作りが大好きなRailsエンジニアのブログです。個人で開発したサービスをいくつか運営しており、今も新しいサービスを開発しています。転職して日々感じていること、個人開発サービス運営のことなどを等身大で書いていきます。

【技術書メモ】パーフェクトRuby on Rails 〜毎週アウトプットチャレンジ①〜

はじめに 

 ということで、毎週 1冊技術書を読んでブログでアウトプットするチャレンジを始めました!
この記事はその第一弾です。 

f:id:ysk_pro:20180715134345j:plain

毎週読むにあたって心がける読み方のポイントはこちらです。

何が書いてあったかを覚えるだけでいい → 辞書のように使う

・具体的なことよりも抽象的な考え方を身につける → 抽象的なことの方が汎用的

できるだけたくさんの本を読んだ方がいい → 引き出しを増やす

アウトプットをする → 考えながら読むようになる 

詳細はこちらのブログに書いています。

ysk-pro.hatenablog.com

「何が書いてあったか」「抽象的な考え方」を中心にアウトプットしていきます。

 

第一弾として読んだ本はこちらです。 

パーフェクトRuby on Rails

パーフェクトRuby on Rails

 
Ruby on Railsの超有名な本です。 
 

1章 Ruby on Railsの概要

Railsの思想>
・CoC(Convention over Configuration)(設定より規約)
(メリット)
 - 規約に従うことで設定ファイルを書く必要がなくなる
 - 開発者毎の設定の差異が無くなり、他のエンジニアと共通のルールでコミュニケーションが取れる
 
・DRY(Don’t Repeat Yourself)
 - 1つのことは1箇所だけに書く
 
・REST(Representational State Transfer)
 - Webアプリケーションの設計概念の1つ
 - 全てのリソースに一意となる識別子(URI)がある
 - URIを通じてリソースを操作する手段を提供する
(メリット)
 - リソースを中心に考えることで、機能追加のしやすい自然な設計になる
 
・自動テスト
 - Railsでは自動テストを行う文化を重要視している
 

2章 Ruby on RailsMVC

・Model:データベースとの接続とデータに対する操作、およびビジネスロジックを書く
・View:Modelの内容を参照し視覚表現を行う
・Controller:Modelのロジック呼び出し、必要なViewの選択など、ModelとViewをつなぐ
 
<モデル>
ActiveRecordによるモデルには、大きく分けて2つの側面がある
 - データベースと接続し、データベースのレコードのレコードとエンティティを結びつける役割
 - ビジネスロジックの実装的な振る舞いに関するところ、すなわちバリデーションや、様々なコールバック(特定の処理に引っ掛けて別の処理を呼ぶこと)などを実行する役割で、ActiveRecordの内部で利用されているActiveModelというモジュールが担っている
 
・モデルにはScopeを定義できる
 - Scopeとは、よく利用する検索結果に名前をつけてひとまとめにしたもの
(メリット)
 - 繰り返し利用するクエリの再利用性が上がる
 - クエリに名前をつけることで可読性が向上する
 
ActiveRecord enumsは、プログラム上では定数のように扱えるが実態は数値で表されるもの
(メリット)
 - 直接文字列として保存するより数値として保存した方がデータベース上の空間効率が良くなる
 
・アプリケーションの主要なロジックはなるべくモデルに書くべき
(メリット) 
 - コードが整理され、テストがしやすくなる
 
<コントローラ>
・コントローラが継承しているApplicationControllerは、アプリケーションのすべてのコントローラで共通するヘルパーや属性、挙動などを定義する場所
 
Railsアプリケーションにおいては、基本的にコントローラが例外処理を担当する
 
<ビュー>
・variantsという機構で、接続してきた端末によって別々のテンプレートを表示させることができる(スマホ用のテンプレートなど)
 
・HTMLタグの付与などビューに特有の加工をする場合は、モデルに変換処理を書くより、ヘルパーを利用するやり方が一般的
 
Railsのビュー処理を通すと、テンプレートエンジン内でRubyのStringのオブジェクトを描画しようとした場合に自動でHTMLタグに対してエスケープ処理が施され、単純なXSSを防ぐことができる
 
・HTTP APIのサーバの場合、必要な情報はHTMLではなく別のフォーマットで渡す場合がほとんど。JSON APIであれば、ビューの担当する仕事はJSONを生成することとなる
 

3章 アセット

Railsではデフォルトでいくつかのアセットパスが用意されている
 - アプリケーションのメイン機能に関わるもの:app/assets
 - 共通で利用するライブラリに関わるもの:lib/assets
 - オープンソースJavaScriptライブラリなどの外部から取得して利用するもの:vendor/assets
 
・アセッツプリコンパイルについての説明
 
CoffeeScript、Sassについての説明
 
・Turbolinksは、JavaScriptCSSに変化が無いのであればタイトルとbodyだけ差し替えることでJavaScriptCSSの読み込みを省略することができ高速化できる、という思想のもとに成り立つ
(注意点)
 - ページ遷移時のイベント発行を前提にしていたり、グローバルな変数にデータをを保持しているJavaScriptは、意図した通りに動作しなくなる場合があるので注意が必要
 

4章 Railsのロードバスとレイヤーの定義方法

MVCに当てはまらないようなモジュールの主要な管理方法
  - モデルとして扱う
  - libディレクトリで管理する
  - 新しいレイヤーを定義する
 
Rails命名規則に沿ったファイル名とクラス名を採用していると自動でファイルをrequireしてくれる、オートローディングという機能が備わっている
 
・Sidekiqは、バックグラウンドで継続する非同期処理を行う
 - SidekiqはRailsとは別にプロセスを立ち上げ、そのプロセスがRailsからのメッセージを受け取りワーカークラスを引き渡して実行することで非同期処理を実現している
 - Sidekiqを使用するためにはRedisが必要になる
 

5章 開発を効率化するgem

・Pry:ステップ実行を行うことができる
 
・Hirb:コンソール上でモデルを表形式で出力できる
 
・Better errors:JavaScriptでの非同期処理などのエラー画面が表示されないようなケースで例外が発生した場合、「/_better_errors」 にアクセスすることで最後に発生した例外のBetter errorsのエラー画面を参照できる
 
rails-erd:モデル情報からER図のPDFを出力できる
 

6章 Railsアプリケーション開発

Twitterログインの実装
 
・ログイン状態を管理するヘルパーメソッド
 
・イベントのCRUD機能実装
 
i18nの設定
 
・よく使うgem(kaminari、ransack、carrierwave)の使い方
 

7章 Railsアプリケーションのテスト

・テストを書く理由
  - 仕様と設計を考える機会が増えることで、仕様の抜け漏れを減らし、きれいな設計になりやすい
  - 手作業によるテストを減らせる
  - ちゃんと動くかどうかの不安を減らせる
  - リファクタリングや仕様変更に対応しやすい
 
・モデル、コントローラ、ビューのテスト、エンドツーエンドのテストの書き方
 
・TDDについて
(メリット)
 - それぞれの段階で、設計すること、実装すること、リファクタリングすることだけに専念できるため、一度にきれいで動くコードを書こうとするのに比べて考えなければいけないことを減らすことができる
 

8章 Railsのインフラと運用

・サーバにデプロイするにあたって必要なミドルウェア
  - ウェブサーバ:ブラウザからのリクエストを一番最初に受け取るサーバ(Nginx、Apache2)
  - アプリケーションサーバRailsのアプリケーション自体をホストするサーバ(UnicornRailsのプロセスを別途立ち上げる形のアプリケーションサーバ、Passenger)
  - データベース
 
Capistranoについて
 

9章 より実践的なモデルの使い方

・コールバックやバリデーションを別クラスに分離するメリット
  - テストのための事前条件を満たすための負荷が減り、テストが容易になる
 
・ActiveModelモジュールを活用することで、自分で定義したプレーンなRubyクラスに対してActiveRecordに備わっている機能を組み込むことができる
 
・モデルとコントローラにデフォルトで存在するconcernディレクトリは、横断的関心事(複数のモデルや機能に跨って影響するもの)を実装する際に利用する
 
・サービスクラスはコントローラとモデルの中間のイメージで、処理そのものをカプセル化し責務を分離したもの
 

10章 Railsを拡張する

・gemを作ることができる方法としての、Rack Middlewareについての説明
 

おわりに

一週間で読むと決めると集中して読めるし、アウトプットすることで頭に残るのでいい感じです。

毎週頑張っていきますよー!

一緒にチャレンジしてくれる方募集中です〜(笑)

パーフェクトRuby on Rails

パーフェクトRuby on Rails