Railsチュートリアル 第７章＜復習＞

第７章の復習メモです。
個人的に重要と思ったことを書きます。

内容が難しくなってきたので、以下３つの視点で書きます。

- 分かったこと
- 分からなかったこと
- 今回はスルーしたこと


#分かったこと

##デバッグ
今回、２通りのデバッグ方法を学んだ。

###1. Webページ上に値を出す方法
**debugメソッド**を使うと、指定した値を出力できる。

```
<%= debug(params) %>
```

この場合、引数paramsの値を画面に出力する。

###2. ソースコードにブレイクポイントを置く方法
**debuggerメソッド**を用いて、
ソースコードにブレイクポイントを置いて、デバッグできる。

書き方

```app/models/user.rb
  def show
    @user = User.find(params[:id])
    debugger     # ← debuggerメソッド
  end
```

この場合、showの画面にアクセスすると、画面が一時的に停止状態になる。
一方、コンソールには、デバッグモードでソースコードが表示される。


##ルーティングの自動生成
`config/routes.rb`ファイルに、

```
resources :users
```

の一行を追加すると、ルーティングを自動生成してくれる。
内容は以下の図の通り。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/506678/4fb79374-c09d-0e55-b235-4f0a5e17f386.png)

アクションは自動生成してくれないので、手動で実装する。

##エラーメッセージ
モデルのメソッドを実行して、結果がfalseになった場合、
エラーメッセージが自動生成される。
内容は、**<インスタンス名>.errors.full_messages**に格納される。

```
$ rails console
>> user = User.new(name: "Foo Bar", email: "foo@invalid",
?>                 password: "dude", password_confirmation: "dude")
>> user.save
=> false
>> user.errors.full_messages
=> ["Email is invalid", "Password is too short (minimum is 6 characters)"]
```

##flash変数
ユーザー登録の成功メッセージなど、
一時的に表示したい内容を格納する変数として、**flash**が用意されている。

この変数は、リダイレクトした直後のページで表示され、
リロードやページ遷移すると、表示が消える。

- 値の格納

```app/controllers/users_controller.rb
class UsersController < ApplicationController
  .
  .
  .
  def create
    @user = User.new(user_params)
    if @user.save
      flash[:success] = "Welcome to the Sample App!" # ← ここでflashに格納
      redirect_to @user
    else
      render 'new'
    end
  end
  .
  .
  .
```

- 値の表示

```app/views/layouts/application.html.erb
<!DOCTYPE html>
<html>
  .
  .
  .
  <body>
    <%= render 'layouts/header' %>
    <div class="container">
      <% flash.each do |message_type, message| %>      # ← ここでflashを表示
        <div class="alert alert-<%= message_type %>"><%= message %></div>
      <% end %>
    .
    .
    .
  </body>
</html>
```


#分からなかったこと

##form_forヘルパーメソッド
form_forヘルパーメソッドを使うと、
何やらRubyで書いた物を、HTMLに変換してくれるらしい。

- form_forヘルパーメソッドを使用

```app/views/users/new.html.erb
<% provide(:title, 'Sign up') %>
<h1>Sign up</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>  # ← ここでform_forヘルパーメソッドを使用
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.email_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>
  </div>
</div>
```

- 生成されたHTML

```
<form accept-charset="UTF-8" action="/users" class="new_user"
      id="new_user" method="post">
  <input name="utf8" type="hidden" value="&#x2713;" />
  <input name="authenticity_token" type="hidden"
         value="NNb6+J/j46LcrgYUC60wQ2titMuJQ5lLqyAbnbAUkdo=" />
  <label for="user_name">Name</label>
  <input id="user_name" name="user[name]" type="text" />

  <label for="user_email">Email</label>
  <input id="user_email" name="user[email]" type="email" />

  <label for="user_password">Password</label>
  <input id="user_password" name="user[password]"
         type="password" />

  <label for="user_password_confirmation">Confirmation</label>
  <input id="user_password_confirmation"
         name="user[password_confirmation]" type="password" />

  <input class="btn btn-primary" name="commit" type="submit"
         value="Create my account" />
</form>
```

何となく法則は分かりそうだが、理解に時間がかかりそうなので、
変換できるという点だけ押さえておく。

##Strong Parametersメソッド
パラーメータを渡す際、普通に渡す

```
@user = User.new(params[:user]) 
```

と、外部からカラムを勝手に変更、追加されたりして危険なので、
決められた属性だけ渡すよう制限できる。

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

private
  def user_params
    params.require(:user).permit(:name, :email, :password,
                   :password_confirmation)
  end
```

危険なのは何となく分かったが、実装の経験がなく
いまいちピンと来ないので、分からなかったことに分類。

以下を参考にさせていただきました。
https://nyoken.com/strong-parameter


#今回はスルーしたこと

- テスト全般
- CSS関係
- デプロイ関係