Ruby on Rails チュートリアル まとめメモ

##　概要
- Title
Ruby on Rails チュートリアル
実例を使ってRailsを学ぼう<br>
Michael Hartl (マイケル・ハートル)
- URL
http://railstutorial.jp/chapters/sign_up?version=4.2#book_menu

##　１章 - ゼロからデプロイまで - まとめ
- Ruby on Railsとは、Web開発のためのフレームワークであり、Rubyプログラミング言語によって記述されている。
- 事前設定済みのクラウド環境を利用することで、Railsのインストール、アプリケーションの生成、生成されたファイルの編集を簡単に行うことができる。
- Railsにはrailsという名前のコマンドラインコマンドがあり、rails newで新しいアプリケーションを生成したり、rails serverでローカルサーバーを実行したりできる。
- コントローラのアクションを追加したり、ルートルーティングを変更したりするだけで「hello, world」アプリケーションを作成できる。
- Gitによるバージョン管理を導入し、Bitbucketの非公開リポジトリにプッシュする理由は、データの喪失を防止し、他の開発者との共同作業を行えるようにするため。
- 作成したアプリケーションをHerokuの本番環境にデプロイした。

##　２章 - Toyアプリケーション - まとめ
- Scaffold機能でコードを自動生成すると、Webのあらゆる部分からモデルデータにアクセスしてやりとりできるようになる。
- Scaffoldは何よりも手っ取り早いのがとりえだが、これを元にRailsを理解するには向いていない。
- RailsではWebアプリケーションの構成にMVC (Model-View-Controller) というモデルを採用している。
- Railsが解釈するRESTには、標準的なURLセットと、データモデルとやりとりするためのコントローラアクションが含まれている。
- Railsではデータのバリデーション (validation) がサポートされており、データモデルの属性の値に制限をかけることができる。
- Railsには、さまざまなデータモデル同士を関連付けを定義するための組み込み関数が多数用意されている。
- Railsコンソールを使用すると、コマンドラインからRailsアプリケーションとやりとりすることができる。

##　３章 - ほぼ静的なページの作成 - まとめ
- 新しいRailsアプリケーションをゼロから作成したのはこれで3度目。今回も必要なgemのインストール、リモートリポジトリへのプッシュ、production環境まで行った。
- コントローラを新規作成するためのrailsのスクリプトはrails generate controller ControllerName <action name (省略可)>。訳注: コントローラ名はキャメルケース、アクション名はスネークケースにする。
- 新しいルーティングはconfig/routes.rbファイルで定義する。
- Railsのビューでは、静的HTMLの他にERB (埋め込みRuby: Embedded RuBy) も使用できる。
- 常に自動化テストを使用して新機能開発を進めることで、自信を持ってリファクタリングできるようになり、回帰バグもいちはやくキャッチできるようになる。
- テスト駆動開発では「レッド・グリーン・リファクタリング」サイクルを繰り返す。
- Railsのレイアウトでは、アプリケーションのページの共通部分をテンプレートに置くことでコードの重複を解決することができる。

##　４章 - Rails風味のRuby - まとめ
- Rubyは文字列を扱うためのメソッドを多数持っている
- Rubyの世界では、すべてがオブジェクトである
- Rubyではdefというキーワードを使ってメソッドを定義する
- Rubyではclassというキーワードを使ってクラスを定義する
- Railsのビューでは静的なHTMLと埋め込みRuby(ERb)が使える
- Rubyの組み込みクラスには配列、範囲、ハッシュなどがある
- Rubyのブロックは (他の似た機能と比べ) 柔軟な機能で、添え字を使ったデータ構造よりも自然にイテレーションができる
- シンボルとはラベルである。追加的な構造を持たない (代入などができない) 文字列みたいなもの。
- Rubyではオブジェクトを継承できる
- Rubyでは組み込みクラスですら内部を見たり修正したりできる
- 「“deified”」という単語は回文である

##　５章 - レイアウトを作成する - まとめ
- HTML5を使ってheaderやfooter、logoやbodyといったコンテンツのレイアウトを定義しました
- Railsのパーシャルは効率化のために使われ、別ファイルにマークアップを切り出すことができます
- CSSは、CSSクラスとidを使ってレイアウトやデザインを調整します
- Bootstrapフレームワークを使うと、いい感じのデザインを素早く実装できる
- SassとAsset Pipelineは、(開発効率のために切り分けられた) CSSの冗長な部分を圧縮し、本番環境に最適化した結果を出力する
- Railsのルーティングでは自由にルールを定義することができ、また、その際に名前付きルートも使えるようになる
統合テストは、ブラウザによるページ間の遷移を効率的にシミュレートする

##　６章 - ユーザーのモデルを作成する - まとめ
- マイグレーションを使うことで、アプリケーションのデータモデルを修正することができる
- Active Recordを使うと、データモデルを作成したり操作したりするための多数のメソッドが使えるようになる
- Active Recordのバリデーションを使うと、モデルに対して制限を追加することができる
- よくあるバリデーションには、存在性・長さ・フォーマットなどがある
- 正規表現は謎めいて見えるが非常に強力である
- データベースにインデックスを追加することで検索効率が向上する。また、データベースレベルでの一意性を保証するためにも使われる
- has_secure_passwordメソッドを使うことで、モデルに対してセキュアなパスワードを追加することができる

##　７章 - ユーザー登録 - まとめ
- debugメソッドを使うことで、役立つデバッグ情報を表示できる
- Sassのmixin機能を使うと、CSSのルールをまとめたり他の場所で再利用できるようなる
- Railsには標準で3つ環境が備わっており、それぞれ開発環境 (development)、テスト環境 (test)、本番環境 (production)と呼ぶ
- 標準的なRESTfulなURLを通して、ユーザー情報をリソースとして扱えるようになった
- Gravatarを使うと、ユーザーのプロフィール画像を簡単に表示できるようになる
- form_forヘルパーは、Active Recordのオブジェクトに対応したフォームを生成する
- ユーザー登録に失敗した場合はnewビューを再描画するようにした。その際、Active Recordが自動的に検知したエラーメッセージを表示できるようにした
- flash変数を使うと、一時的なメッセージを表示できるようになる
- ユーザー登録に成功すると、データベース上にユーザーが追加、プロフィールページにリダイレクト、ウェルカムメッセージの表示といった順で処理が進む
- 統合テストを使うことで送信フォームの振る舞いを検証したり、バグの発生を検知したりできる
- セキュアな通信と高いパフォーマンスを確保するために、本番環境ではSSLとPumaを導入した

##　８章 - ログイン、ログアウト - まとめ
- Railsでは、あるページから別のページに移動するときに状態を保持することができます。ページの状態の保存には、一時cookiesと永続cookiesのどちらも使用できます。
- ログインフォームは、ユーザーがログインするための新しいセッションを作成するように設計されています。
- flash.nowメソッドを使用すると、レンダリング済みのページにもフラッシュメッセージを表示できます。
- テスト駆動開発は、テストでバグを再現してからデバッグしたい場合に便利です。
- sessionメソッドを使用すると、ユーザーIDを安全にブラウザに保存して一時セッションを作成できます。
- ログインの状態に応じて、レイアウト上のリンクなどの機能を変更できます。
- 統合テストでは、ルーティング、データベースの更新、レイアウトの変更が正しく行われているかどうかを確認できます。
- 記憶トークンやそれと対応する記憶ダイジェストをユーザーごとに関連付けて、永続的セッションで使用できます。
- cookiesメソッドを使用すると、永続的な記憶トークンのcookiesをブラウザに保存して、永続的セッションを作成できます。
- ログイン状態 (ログインしているかどうか) は、一時セッションのユーザーIDか、永続的セッションの一意な記憶トークンに基いた現在のユーザーが存在しているかどうかで決定されます。
- セッションのユーザーIDを削除し、ブラウザの永続的cookiesを削除すると、アプリケーションからユーザーがログアウトします。
- 三項演算子を使用すると、単純なif-thenステートメントをコンパクトに記述することができます。

##　９章 - ユーザーの更新・表示・削除 - まとめ
- ユーザーは、編集フォームからPATCHリクエストをupdateアクションに対して送信し、情報を更新する
- Strong Parametersを使うことで、安全にWeb上から更新させることができる
- beforeフィルターを使うと、特定のアクションが実行される直前にメソッドを呼び出すことができる
- beforeフィルターを使って、認可 (アクセス制御) を実現した
- 認可に対するテストでは、特定のHTTPリクエストを直接送信する低級なテストと、ブラウザの操作をシミュレーションする高級なテスト (統合テスト) の2つを利用した
- フレンドリーフォワーディングとは、ログイン成功時に元々行きたかったページに転送させる機能である
- ユーザー一覧ページでは、すべてのユーザーをページ毎に分割して表示する
- rake db:seedコマンドは、db/seeds.rbにあるサンプルデータをデータベースに流し込む
- render @usersを実行すると、自動的に_user.html.erbパーシャルを参照し、各ユーザーをコレクションとして表示する
- 論理属性adminを追加すると、自動的にuser.admin?メソッドが使えるようになる
- 管理者が削除リンクをクリックすると、DELETEリクエストがdestroyアクションに向けて送信され、該当するユーザーが削除される
- fixtureファイル内で埋め込みRubyを使うと、多量のテストユーザーを作成することができる


##　１０章 - アカウント有効化とパスワード再設定 - まとめ
- アカウント有効化は Active Recordオブジェクトではないが、セッションの場合と同様に、リソースでモデル化できる。
メール送信のためのActive Mailerアクションやビューの生成機能がRailsに備わっている。
- Action MailerではテキストメールとHTMLメールを両方利用できる。
- メイラーアクションで定義したインスタンス変数は、他のアクションやビューと同様、メイラーのビューから参照できる。
- パスワードの再設定は Active Recordオブジェクトではないが、セッションやアカウント有効化の場合と同様に、リソースでモデル化できる。
- アカウント有効化やパスワード再設定では、ユーザーを有効化したりパスワードを再設定するために一意のURLを作成する。一意のURLには生成したトークンが使用される。
- メイラーのテストと統合テストは、どちらもUserメイラーの振舞いを確認するのに有用。
- SendGridを使用するとproduction環境からメールを送信できる。

##　１１章 - ユーザーのマイクロポスト - まとめ
- Active Recordモデルの力によって、マイクロポストも (ユーザーと同じで) リソースとして扱える
- Railsは複数のキーインデックスをサポートしている
- Userは複数のMicropostsを持っていて (has_many)、Micropostは1人のUserに依存している (belongs_to) といった関係性をモデル化した
- has_manyやbelongs_toを利用することで、関連付けを通して多くのメソッドが使えるようになった
- user.microposts.build(...)というコードは、引数で与えたユーザーに関連付けされたマイクロポストを返す
- default_scopeを使うとデフォルトの順序を変更できる
- default_scopeは引数に無名関数 (->) を取る
- dependent: :destroyオプションを使うと、関連付けされたオブジェクトが削除されると同時に、自分自身も削除する
- paginateメソッドやcountメソッドは、どちらも関連付けを通して実行され、効率的にデータベースに問い合わせしている
- fixtureは、関連付けを使ったオブジェクトの作成もサポートとしている
- パーシャルを呼び出すときに、一緒に変数を渡すことができる
- whereメソッドを使うと、Active Recordを通して選択 (部分集合を取り出すこと) ができる
- 依存しているオブジェクトを作成/削除するときは、常に関連付けを通すようにすることで、よりセキュアな操作が実現できる
- CarrierWaveを使うと画像アップロードや画像リサイズができる

##　１２章 - ユーザーをフォローする - まとめ
- has_many :throughを使うと、複雑なデータ関係をモデリングできる
- has_manyメソッドには、クラス名や外部キーなど、いくつものオプションを渡すことができる
- 適切なクラス名と外部キーと一緒にhas_many/has_many :throughを使うことで、能動的関係 (フォローする) や受動的関係 (フォローされる) がモデリングできた
ルーティングは、ネストさせて使うことができる
- whereメソッドを使うと、柔軟で強力なデータベースへの問い合わせが作成できる
- Railsは (必要に応じて) 低級なSQLクエリを呼び出すことができる
- 本書で学んだすべてを駆使することで、フォローしているユーザーのマイクロポスト一覧をステータスフィードに表示させることができた


##　チュートリアル実施ソースコード

-  URL
https://github.com/eris-dwarf-planet/ruby-study/tree/master/rails-sample/tutorialapp