35歳だけどRailsチュートリアルやってみた。[第4版 9章 9.2 [Remember me] チェックボックス まとめ&解答例]

#はじめに
最近、プロジェクト管理業務が業務の大半を占めており、
プログラムを書く機会がなかなかありません。

このままだとプログラムがまったく書けない人になってしまう危機感（迫り来る35歳定年説）と、
新しいことに挑戦したいという思いから、
[Ruby on Rails チュートリアル実例を使ってRailsを学ぼう 第4版](https://railstutorial.jp/)を学習中です。
業務で使うのはもっぱらJavaなのですが、Rails楽しいですね。


これまでEvernoteに記録していましたが、ソースコードの貼付けに限界を感じたため、
Qiitaで自分が学習した結果をアウトプットしていきます。

個人の解答例なので、誤りがあればご指摘ください。

##9.2 [Remember me] チェックボックス
###本章での学び
####チェックボックスの作成
ログインフォームにチェックボックスを追加する。
他のラベルやテキストフィールドと同様にヘルパーメソッドで作成できる。
フォームラベルの内側に記載する必要がある。

```/sample_app/app/views/sessions/new.html.erb
      <%= f.label :remember_me, class: "checkbox inline" do %>
        <%= f.check_box :remember_me %>
        <span>Remember me on this computer</span>
      <% end %>
```

bootstrapの2つのclass（checkbox,inline）をincludeしているが、
この状態では表示が崩れてしまう。

![image](https://qiita-image-store.s3.amazonaws.com/0/98130/1e46434e-07cc-12a5-e356-1db197e4d033.png)

####スタイルを整える

`.checkbox`はクラスの指定。
`class= checkbox`の部分のスタイルを整える。
以下、適用対象のHTML。

```html
<label class="checkbox inline" for="session_remember_me">
        <input name="session[remember_me]" type="hidden" value="0"><input type="checkbox" value="1" name="session[remember_me]" id="session_remember_me">
        <span>Remember me on this computer</span>
</label>
```


- checkboxクラスの上マージンを-10px取る
- checkboxクラスの下マージンを10px取る
- spanタグの左マージンを20px取る
- spanタグのフォントを標準にする

```/sample_app/app/assets/stylesheets/custom.scss
.checkbox {
  margin-top: -10px;
  margin-bottom: 10px;
  span {
    margin-left: 20px;
    font-weight: normal;
  }
}
```

`#session_remember_me`はセレクタの指定。
`id=session_remember_me`の部分のスタイルを整える。
以下、適用対象のチェックボックス部分のHTML。

```html
<input type="checkbox" value="1" name="session[remember_me]" id="session_remember_me">
```

- 幅を状況に応じて自動調整する
- 左マージンを0にする

```/sample_app/app/assets/stylesheets/custom.scss
#session_remember_me {
  width: auto;
  margin-left: 0;
}
```

完成。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/442b1306-913a-32ac-a1ce-5bdbc6a57d55.png)


####チェックボックスの値の取得
ログインフォームから送信される`params`ハッシュから、チェックボックスの値が取得できる。
オンの場合１、オフの場合０が取得できる。

```
params[:session][:remember_me]
```

これは、ログインフォーム内にチェックボックスの`value="1"`と、hidden項目として`value="0"`があるため。

```html
<input name="session[remember_me]" type="hidden" value="0">
<input type="checkbox" value="1" name="session[remember_me]" id="session_remember_me">
```

####【Controller】createアクションの修正
sessionsコントローラ内のcreateアクションを修正する。
三項演算子を使って、以下の条件分岐を１行で記載できる。

- `value="1"`の場合、ユーザ情報を記憶する
- `value="0"`の場合、ユーザ情報を削除する

```/sample_app/app/controllers/sessions_controller.rb
  def create
    user = User.find_by(email: params[:session][:email].downcase)
    if user && user.authenticate(params[:session][:password])
      #ユーザログイン後にユーザ情報のページヘリダイレクトする
      log_in user
      #チェックされていたらユーザを記憶する
      params[:session][:remember_me] == '1' ? remember(user) : forget(user)
      redirect_to user
```


###演習1
*ブラウザでcookies情報を調べ、[remember me] をチェックしたときに意図した結果になっているかどうかを確認してみましょう。*


remember meをチェックしてログインする。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/3066a35b-bc2c-f02f-b331-b1c519af243a.png)

cookiesの値を確認する。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/c109a66f-a493-ac5a-44af-cbb9aa950fed.png)

ブラウザを閉じて、再度アプリにアクセスする。
ログイン状態が保持され、`remember_token`の値が変わっていないことを確認。
![image](https://qiita-image-store.s3.amazonaws.com/0/98130/f31e3029-2a57-fec3-c403-144a6d75fa33.png)

###演習2
*コンソールを開き、三項演算子を使った実例を考えてみてください (コラム 9.2)。*

DB内のユーザ数を調べて、１人の場合とそれ以外でメッセージを出し分ける。

```irb
>> User.count == 1 ? "ユーザ数は１人です" : "複数のユーザが登録されています"
   (0.4ms)  SELECT COUNT(*) FROM "users"
=> "ユーザ数は１人です"
```

#おわりに
9.1章に比べるとボリュームも少なく、楽にできました。

RailsはHTMLが自動生成されるので、
CSSの装飾も完成後のHTMLを意識して書くと良いかもしれません。

あと、三項演算子便利ですね。
DRYな書き方ができるように精進します。