【Rails tutorial】7章まとめ

```erb:app/application.hrml.erb
<!DOCTYPE html>
<html>
  .
  .
  .
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <%= yield %>
      <%= render 'layouts/footer' %>
      <%= debug(params) if Rails.env.development? %>
    </div>
  </body>
</html>
```
デバッグ情報は開発環境のみに表示されるようになる

```
controller: static_pages
action: home
```
paramsに含まれてる内容でYAMLという形式で書かれている


RESTの原則に従う場合、リソースへの参照はリソース名とユニークなIDを使うのが普通
例)
ユーザーをリソース
id=1のユーザーを参照する
⇢ /users/1というURLに対してGETリクエストを発行する


ここでいうshowアクションは暗黙のリクエストになる

![Screen Shot 0001-11-27 at 12.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212678/9380644b-06fb-e39d-7c7b-3c480ec10b96.png)


```ruby:app/views/users/show.html.erb
<%= @user.name %> , <%= @user.email %>
```

```ruby:app/controllers/user_controller.rb
def show
  @user = User.find(params[:id])
end
```

ユーザーのid読み出しにはparamsを使用
Usersコントローラにリクエストが正常に送信されると
params[:id]の部分はユーザーidの1に置き換わる
params[:id]は文字列型の'1'だが
findメソッドでは自動的に整数型に変換される




![Screen Shot 0001-11-27 at 13.06.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/212678/f0cf23e8-90c1-7929-d467-ac66dc1f1b33.png)



# 7.2 ユーザー登録フォーム
```erb
<%= form_for(@user) do |f| %>
  .
  .
  .
<% end %>
```
doキーワードは、form_forが1つの変数を持つブロックを取ることを表す
fはformのf

```erb
<%= f.label :name %>
<%= f.text_field :name %>
```
Userモデルのname属性を設定する、ラベル付きテキストフィールド要素を作成するのに必要なHTMLを作成




```ruby
"user" => { "name" => "Foo Bar",
            "email" => "foo@invalid",
            "password" => "[FILTERED]",
            "password_confirmation" => "[FILTERED]"
          }
```

上のハッシュはUsersコントローラにparamsとして渡される
このparamsハッシュには各リクエストの情報が含まれてる。
ユーザー登録情報の送信の場合、paramsには複数のハッシュに対するハッシュ(入れ子になったハッシュ)が含まれる。
上のデバッグ情報では、フォーム送信の結果が、送信された値に対応する
属性とともにuserハッシュに保存される


# 7.3.2 Strong Parameters

### 以前のバージョンのRails
モデル層で `attr_accessible`メソッドを使ってた

### Rails 4.0
コントローラ層で `Strong Parameters`を使うことが推奨されている

### Strong Parameters を使って
必須のパラメータと許可されたパラメータを指定することができる。
paramsハッシュをまるごと渡すとエラーが発生するので、Railsはデフォルトでマスアサインメントの脆弱性から守られるようになった。

paramsハッシュでは`:user`属性を必須として、名前、メールアドレス、パスワード、パスワードの確認の属性をそれぞれ許可してそれ以外を許可しないようにしたいと考えてる

```ruby
params.require(:user).permit(:name, :email, :password, :password_confirmation)
```

このパラメータを使いやすくするために、user_paramsという外部メソッドを使うのが
慣習になっている

```ruby
@user = User.new(user_params)
```

この`user_params`メソッドはUsersコントローラの内部でのみ実行され、Web経由で外部ユーザーにさらされる必要はないため、privateキーワードを使って外部から使えないようにする



# 7.3.3 エラーメッセージ
`errors.full_messages`オブジェクトはエラーメッセージの配列を持っている

`shared/error_messages`
Rails全般の慣習として、複数のビューで使われるパーシャルは専用のディレクトリ`shared`によく置かれる


# 7.3.4 失敗時のテスト
新規ユーザー登録用の統合テストを生成

```Terminal
$ rails g integration_test users_signup
  invoke test_unit
  create  test/integration/users_signup_test.rb
```

ユーザー登録ボタンを押した時に(ユーザー情報が無効だから)ユーザーが作成されないことを確認

getメソッドでユーザー登録ページアクセス


```ruby
get signup_path
```

フォーム送信をテストするには users_pathに対してPOSTリクエストを送信する必要がある。これはpostメソッドを使って実現する

```ruby
assert_no_difference 'User.count' do
  post users_path, params: {user: {name: "",
                                   email: "user@invalid",
                                   password:              "foo",
                                   password_confirmation: "bar"}}
end
```

assert_no_difference メソッドのブロック内でpostを使い、メソッドの引数には'User.count'を与える。これはassert_no_differenceのブロックを実行する前後で引数の値(User.count)が変わらないことをテストしている。
⇢ ユーザー数を覚えた後にデータを投稿してみて、ユーザーが変わらないかどうかを検証するテスト



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