質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

1594閲覧

rails バリデーションが効かない

hazuma

総合スコア20

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

1クリップ

投稿2021/04/06 17:23

編集2021/04/07 04:01

ローカルでテストを行った際にエラーが起きる。
このバリデーションのエラーを直すにはどうしたら良いでしょうか??
見た感じコードの書き間違えなどは無いような気がします。
#エラーメッセージ

1) Board 本文が65536文字以上の場合 無効であること Failure/Error: expect(board).to be_invalid expected `#<Board id: nil, title: "タイトル4", body: "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa...", user_id: nil, created_at: nil, updated_at: nil>.invalid?` to return true, got false # ./spec/models/board_spec.rb:66:in `block (3 levels) in <main>' Finished in 11.15 seconds (files took 7.84 seconds to load) 24 examples, 1 failure Failed examples: rspec ./spec/models/board_spec.rb:64 # Board 本文が65536文字以上の場合 無効であること

#該当しそうなコード

boardrb

1class Board < ApplicationRecord 2 validates :title, presence: true, length: { maximum: 255 } 3 validates :body, presence: true, length: { maximum: 65536 } 4 belongs_to :user 5end

schema

1create_table "boards", force: :cascade do |t| 2 t.string "title", null: false 3 t.text "body", null: false 4 t.integer "user_id", null: false 5 t.datetime "created_at", null: false 6 t.datetime "updated_at", null: false 7 t.index ["user_id"], name: "index_boards_on_user_id" 8 end

board.specrb

1require 'rails_helper' 2 3RSpec.describe Board, type: :model do 4 5 context '全てのフィールドが有効な場合' do 6 it '有効であること' do 7 board = build(:board) 8 expect(board).to be_valid 9 end 10 end 11 12 context 'タイトルが存在しない場合' do 13 it '無効であること' do 14 board = build(:board, title: nil) 15 expect(board).to be_invalid 16 expect(board.errors[:title]).to include('を入力してください') 17 end 18 end 19 20 context '本文が存在しない場合' do 21 it '無効であること' do 22 board = build(:board, body: nil) 23 expect(board).to be_invalid 24 expect(board.errors[:body]).to include('を入力してください') 25 end 26 end 27 28 context 'タイトルが255文字以下の場合' do 29 it '有効であること' do 30 board = build(:board, title: 'a' * 255) 31 expect(board).to be_valid 32 end 33 end 34 35 context 'タイトルが256文字以上の場合' do 36 it '無効であること' do 37 board = build(:board, title: 'a' * 256) 38 expect(board).to be_invalid 39 expect(board.errors[:title]).to include('は255文字以内で入力してください') 40 end 41 end 42 43 context '本文が65535文字以内の場合' do 44 it '有効であること' do 45 board = build(:board, body: 'a' * 65535) 46 expect(board).to be_valid 47 end 48 end 49 50 context '本文が65536文字以上の場合' do 51 it '無効であること' do 52 board = build(:board, body: 'a' * 65536) 53 expect(board).to be_invalid 54 expect(board.errors[:body]).to include('は65535文字以内で入力してください') 55 end 56 end 57end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinoharat

2021/04/07 01:49

board_spec.rb も質問に載せてください。
hazuma

2021/04/07 04:02

boards_spec.rb追加いたしました。よろしくお願いします
guest

回答1

0

ベストアンサー

バリデーションが 65536 文字までOKになってます。

rb

1validates :body, presence: true, length: { maximum: 65536 }

一方、テストで 65536 なら invalid になることを期待していますが、65536 はギリギリセーフな文字数です。
なので、期待した結果が得られずにテストに失敗しています。

モデル側のmaximumを1減らすか、テスト側のbodyを1増やせば良いと思います。

投稿2021/04/07 06:54

shinoharat

総合スコア1685

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hazuma

2021/04/07 08:24

テストが通りました有難うございました! 私のコードの読み取りが甘かったです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問