0
0

More than 1 year has passed since last update.

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

Posted at

Micropostのバリデーション

新しいMicropostの有効性に対するテスト

test/models/micropost_test.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

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

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

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 }
  # 最大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?を実行すると、失敗することを確認してみましょう。また、生成されたエラーメッセージにはどんな内容が書かれているでしょうか?

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

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

>> 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)"]
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0