メモランダム Rails tutorial　第7章

# Rails tutorial 第7章

## ユーザー登録
- いよいよユーザー登録機能を追加しましょう
 - 7.2ではHTML フォームを使ってWebアプリケーションに登録情報を送信
 - 7.4ではユーザーを新規作成して情報をデータベースに保存
- ユーザーを表示するためのページを作成し、ユーザー用のRESTアーキテクチャを実装する第一歩を踏み出します


# 1.ユーザーを表示する
- モックアップ

### デバッグとRails環境
- ビルトインのdebugメソッドとparams変数を使って、各プロフィールページにデバッグ用の情報が表示されるようになります
 - `<%= debug(params) if Rails.env.development? %>`
- **デバッグ情報は開発環境以外で表示させないべき**

# 2.Usersリソース
- resources :usersという行は、ユーザー情報を表示するURL (/users/1) を追加するためだけのものではありません。
 - サンプルアプリケーションにこの１行を追加すると、ユーザーのURLを生成するための多数の名前付きルート (5.3.3) と共に、RESTfulなUsersリソースで必要となるすべてのアクションが利用できるようになるのです

- ーザーのid読み出しにはparamsを使いました。
 - Usersコントローラにリクエストが正常に送信されると、params[:id]の部分はユーザーidの1に置き換わります

### debuggerメソッド
- 直接的にデバッグする方法もあります。それがbyebug gemによるdebuggerメソッドです

### Gravatar画像とサイドバー
- 今度は各ユーザーのプロフィール写真のあたりをもう少し肉付けし、サイドバーも作り始めましょう
- Gravatarは無料のサービスで、プロフィール写真をアップロードして、指定したメールアドレスと関連付けることができます


- gravatar_forヘルパーメソッドを使ってGravatarの画像を利用できるようにします
- Rubyでは、Digestライブラリのhexdigestメソッドを使うと、MD5のハッシュ化が実現できます。


# 2.ユーザー登録フォーム
- モックアップ確認

### form_tagを使用する
- Railsでform_forヘルパーメソッドを使います
 - このメソッドはActive Recordのオブジェクトを取り込み、そのオブジェクトの属性を使ってフォームを構築します。
- ユーザーオブジェクトの作成
- 登録フォーム

### フォームHTML
- doキーワードは、 form_forが1つの変数を持つブロックを取ることを表します。この変数fは “form” のfです。
- Railsヘルパーを使っている場合、実装の詳細について知っておく必要はありません。
 - **ただしfというオブジェクトが何をするのかは知っておく必要があります。**
  - このfオブジェクトは、HTMLフォーム要素 (テキストフィールド、ラジオボタン、パスワードフィールドなど) に対応するメソッドが呼び出されると、@userの属性を設定するために特別に設計されたHTMLを返します
  
# 3.ユーザー登録失敗
- フォームを理解するにはユーザー登録の失敗のときが最も参考になります

### 正しいフォーム
- createアクションでフォーム送信を受け取り、User.newを使って新しいユーザーオブジェクトを作成し、ユーザーを保存 (または保存に失敗) し、再度の送信用のユーザー登録ページを表示するという方法で機能を実装しようと思います
- render メソッドを再度使いまわし

### Strong Parameters
- user_paramsという外部メソッドを使うのが慣習になっています
- `@user = User.new(user_params)`

### エラーメッセージ
- Railsは、このようなメッセージをUserモデルの検証時に自動的に生成してくれます
- errors.full_messagesオブジェクトは、 エラーメッセージの配列を持っています
- 'shared/error_messages'というパーシャルをrender (描画) している点に注目

- any?メソッドはちょうどempty?と逆の動作で、要素が1つでもある場合はtrue、ない場合はfalseを返します
- pluralizeの最初の引数に整数が与えられると、それに基づいて2番目の引数の英単語を複数形に変更したものを返します。このメソッドの背後には強力なインフレクター (活用形生成) があり、不規則活用を含むさまざまな単語を複数形にすることができます。
 - これにより、"1 errors" のような英語の文法に合わない文字列を避けることができます (これはWeb上でどうしようもないほどよく見かけるエラーです)。

### 失敗時のテスト
- 有効な送信をしたときの正しい振る舞いについてテストを書いていきます
- 色々（パス）

# 4.ユーザー登録成功
- まずは、ユーザーを保存できるようにします

### 登録フォームの完成
- Railsの一般的な慣習に倣って、ユーザー登録に成功した場合はページを描画せずに別のページにリダイレクト (Redirect) するようにしてみましょう
- redirect_to メソッド

### flash 
- 登録完了後に表示されるページにメッセージを表示し (この場合は新規ユーザーへのウェルカムメッセージ)、2度目以降にはそのページにメッセージを表示しないようにするというものです
- `flash[:success] = "Welcome to the Sample App!"`

### 実際のユーザー登録
- データベースの内容を一旦リセット

### 成功時のテスト
- 今回はassert_differenceというメソッドを使ってテストを書きます
 - このメソッドは第一引数に文字列 ('User.count') を取り、assert_differenceブロック内の処理を実行する直前と、実行した直後のUser.countの値を比較します。第二引数はオプションですが、ここには比較した結果の差異 (今回の場合は1) を渡します。


# 5.プロのデプロイ
- このアプリケーションをデプロイして、本番環境でも動かせるようにしてみましょう
 - 実際にデータを操作できるようにするデプロイは初めて

- デプロイの下準備として、まずはこの時点までの変更をmasterブランチにマージしておいてください。

### 本番環境でのSSL
- このようなネットワークに流れるデータは途中で捕捉できるため、扱いには注意が必要です。これはサンプルアプリケーションの本質的なセキュリティ上の欠陥です。
 - そしてこれを修正するために**Secure Sockets Layer (SSL)**を使います 12。これはローカルのサーバからネットワークに流れる前に、大事な情報を暗号化する技術です

- production.rbという本番環境の設定ファイルの1行を修正するだけで済みます。具体的には、configに「本番環境ではSSLを使うようにする」という設定をするだけです 


### 本番環境用のWebサーバー
- WEBrickは本番環境として適切なWebサーバではありません。よって、今回はWEBrickをPumaというWebサーバに置き換えてみます
- 新しいWebサーバを追加するために、Heroku内のPumaドキュメント (英語) に従ってセットアップしていきます。

### 本番環境へのデプロイ
- 変更をコミットし、デプロイしてみましょう
- ** 次の点は頭の片隅に置いておいてください。それは、仕事でHerokuを使ったアプリケーションを動かす場合はGemfileでRubyのバージョンを明示しておいた方が賢明である、という点です**

# 6.最後に
- 第8章と第9章では、認証 (authentication) システムを導入し、ユーザーがログインとログアウトをできるようにします ([remember me] という発展的な機能も実装します)。

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