railsチュートリアル第１３章 Micropostのバリデーション

###Micropostのバリデーション
####新しいMicropostの有効性に対するテスト
test/models/micropost_test.rb

```rb
require 'test_helper'

class MicropostTest < ActiveSupport::TestCase

  def setup
    @user = users(:michael)
    # このコードは慣習的に正しくない
    @micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
    # micropostのカラムに情報を入力
  end

  test "should be valid" do
    assert @micropost.valid?
    # 有効？
  end

  test "user id should be present" do
　# あらゆるマイクロポストはユーザーのidを持っているべき
    @micropost.user_id = nil
    # user_idをnilにする
    assert_not @micropost.valid?
    # 有効じゃないようね？
  end
end
```

####マイクロポストのuser_idに対する検証
app/models/micropost.rb

```rb
class Micropost < ApplicationRecord
# ApplicationRecordを継承したモデルが作られます
  belongs_to :user
  # userモデルとの間に「1対1」のつながりが設定
  # 割り当てる
  validates :user_id, presence: true
  # presence これは存在するか？
  # presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、
  #   オブジェクトが存在しなければnilを返すメソッドとなります
end
```

####Micropostモデルのバリデーションに対するテスト
test/models/micropost_test.rb

```rb
require 'test_helper'

class MicropostTest < ActiveSupport::TestCase

  def setup
    @user = users(:michael)
    # このコードは慣習的に正しくない
    @micropost = Micropost.new(content: "Lorem ipsum", user_id: @user.id)
  end

  test "should be valid" do
    assert @micropost.valid?
    # 有効？
  end

  test "user id should be present" do
  # あらゆるマイクロポストはユーザーのidを持っているべき
    @micropost.user_id = nil
    # user_idをnilにする
    assert_not @micropost.valid?
    # 有効じゃないようね？
  end
  
  test "content should be present" do
    @micropost.content = "   "
    # contentが無い
    assert_not @micropost.valid?
    # 有効じゃ無いよね？
  end

  test "content should be at most 140 characters" do
    @micropost.content = "a" * 141
    # 141文字にする
    assert_not @micropost.valid?
    # 有効じゃ無いよね
  end
end
```

####Micropostモデルのバリデーション 
app/models/micropost.rb

```rb
class Micropost < ApplicationRecord
# ApplicationRecordを継承したモデルが作られます
  belongs_to :user
  # userモデルとの間に「1対1」のつながりが設定
  # 割り当てる
  validates :user_id, presence: true
  # presence これは存在するか？
  # presenceメソッドはオブジェクトが存在すればそのオブジェクトを返し、
  #   オブジェクトが存在しなければnilを返すメソッドとなります
  validates :content, presence: true, length: { maximum: 140 }
  # 最大１４０文字まで
end
```

```
ubuntu:~/environment/sample_app (user-microposts) $ rails test:models
Started with run options --seed 8840

  14/14: [============================] 100% Time: 00:00:00, Time: 00:00:00

Finished in 0.32843s
14 tests, 22 assertions, 0 failures, 0 errors, 0 skips
```


###演習
1.
Railsコンソールを開き、user_idとcontentが空になっているmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?

```rb
>> micropost.errors.full_messages
=> ["User must exist", "User can't be blank", "Content can't be blank"]
```

2.
コンソールを開き、今度はuser_idが空でcontentが141文字以上のmicropostオブジェクトを作ってみてください。このオブジェクトに対してvalid?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?

```rb
>> micropost.content = "a" * 142
=> "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"
>> micropost.valid?
=> false
>> micropost.errors.full_messages
=> ["User must exist", "User can't be blank", "Content is too long (maximum is 140 characters)"]
```