Railsチュートリアルで押さえておくべきポイント 6・７章

#6章：モデル操作
- 開発環境でposgresqlでなく、sqliteを仕様する場合、「rails db:create」は実行しない。
※ローカル環境でpostgresqlを指定せず、herokuなどの本番環境のみpostgresqlを指定しているため。

- ActiveRecordの前に、sqlの基礎を抑えとく必要がある。今後、アソシエーションが複雑なテーブルを操作する時に苦労する。

- saveメソッドは、booleanを返す。save!は例外を発生させる。
デバックの時に、使い分けることもあるとのこと。

- User.allはArrayクラスの配列ではなく、User::ActiveRecord_Relationクラスのオブジェクト。この理解がないと、今後、統合テストなどを実装する際にミスする。

```
# コンソールで、管理者権限をつける時は、このように属性をupdateさせる。
# updateメソッドとの違いはバリデーションを省略して単一属性を変更する点にある。
user.update_attribute(:admin, true)　
```

```
# DBをいじりたくなくけど、モデル、DBの挙動を確認したい時、オプションをつける。
$ rails console --sandbox
```

- モデルのバリデーション機能は、テスト駆動開発と相性が良い。バリデーション機能が正常に機能しているかどうか、まず失敗するテストを書き、次にテストを成功させるように実装すると、期待した通りに動いている自信を持てるようになる。テストを書く意味が、
まずはここにある。

【モデルテストの流れ】
 1.テストでバリデーションが通る条件のコードを記載。
 2.テストをわざと失敗させる。
 3.モデルクラスのバリデーションを設定。
 4.テストを通す。　

- minitestのsetupメソッドは、rspecのbeforeに似ている。


- [インスタンス].errors.full_messagesでバリデーション時のエラーメッセージを取得できる。デバック時に使える。

```ruby
# string型でmigrateしたemailの文字数のmaxはstring型に合わせ255文字にすることがほぼ。
validates :email, presence: true, length: { maximum: 255 }
```

- %w[foo bar baz],%i[foo bar baz]は、多様する。


```ruby
test "email validation should accept valid addresses" do
    valid_addresses = %w[user@example.com USER@foo.COM A_US-ER@foo.bar.org
                         first.last@foo.jp alice+bob@baz.cn]
    valid_addresses.each do |valid_address|
      @user.email = valid_address
      assert @user.valid?, "#{valid_address.inspect} should be valid"
    end
  end
``` 
"#{valid_address.inspect} sholud be valid"の記載で、どのemailにバリデーションがかかったか、わかりやすい。


```ruby
# 一般的なemailカラムに関するバリデーション
# self.email = self.email.downcaseまたは{ self.email = email.downcase }とも書ける。
before_save { email.downcase! }
VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :email, presence: true, length: { maximum: 255 },
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: { case_sensitive: false }
# case_sensitiveは大文字か小文字かを区別するメソッド
```
- DBにカラムを作成するとき、そのカラムでレコードを検索する (find) 必要があるかどうかを考える。必要がある場合は、DB側でindexを付与してあげる。

- dupは、同じ属性を持つデータを複製するためのメソッド。一意性のemailかどうかテストする時に使用すると有効。

- has_secure_passwordを該当モデルのファイルに記述する意味
 1. ハッシュ化したパスワードをpassword_digestカラムに保存
 2. form_withなどでpassword, password_confirmationを使える。
 3. authenticateメソッドを使える。（controllerのcreateアクションの所で主に使う）  
※bcrypt gemをbundle installする必要あり

***
#7章：ユーザー登録
```html:app/views/layouts/application.html.erb
# parameterを追いたい時に便利。
# これはparamsに含まれている内容で、YAML形式で書かれている。YAMLは基本的にハッシュであり、コントローラとページのアクションを一意に指定している
    <%= debug(params) if Rails.env.development? %>
  <div>
</body>
```
```ruby
#　下記でコンソールで出力するとデバック時などに情報を整理しやすい
puts user.attributes.to_yaml
```
```css
/* デバックの表示をかっこよくする */
@mixin box_sizing {
  -moz-box-sizing:    border-box;
  -webkit-box-sizing: border-box;
  box-sizing:         border-box;
}
.
.
.
/* miscellaneous */

.debug_dump {
  clear: both;
  float: left;
  width: 100%;
  margin-top: 45px;
  @include box_sizing;
```

- params[:id]は文字列型の "1" ですが、findメソッドでは自動的に整数型に変換させる。
  ※parameterで送られている際は、id: '1'と文字列。

- debuggerメソッドの他に、別途gemが必要だけどbinding.pryもある。
- Gravatarを使えば、画像の置き場所の悩みを解決します。このメリットは大きい。gemとはもいらない。
反映させる画像は、メールアドレスに紐づいている。

```ruby:app/helpers/users_helper.rb
module UsersHelper

  # 引数で与えられたユーザーのGravatar画像を返す
  # Rubyでは、Digestライブラリのhexdigestメソッドを使うと、MD5のハッシュ化ができる。
#  def gravatar_for(user, options = { size: 80 })
#  def gravatar_for(user, size: 80)でサイズ指定ができる。
  def gravatar_for(user)
    gravatar_id = Digest::MD5::hexdigest(user.email.downcase)
    gravatar_url = "https://secure.gravatar.com/avatar/#{gravatar_id}"
    image_tag(gravatar_url, alt: user.name, class: "gravatar")
  end
end
```

```ruby
<%= gravatar_for @user %>
```
- cssでの要素しての時に「first-child」「last-child」を使うと、子要素の指定が楽で便利。

- 、無効な内容の送信によって元のページに戻されると、CSSクラスfield_with_errorsを持ったdivタグでエラー箇所を自動的に囲んでくれる。
- 本番環境のSSL化

```ruby:config/environments/production.rb
Rails.application.configure do
  .
  # Force all access to the app over SSL, use Strict-Transport-Security,
  # and use secure cookies.
  config.force_ssl = true
  .
end
```
herokuで独自ドメインを設定する場合は、別途 SSL証明書の発行とセットアップが必要。
https://devcenter.heroku.com/articles/ssl

herokuのwebサーバーをpumaに切り替える方法
https://devcenter.heroku.com/articles/deploying-rails-applications-with-the-puma-web-server