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

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

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

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Q&A

解決済

2回答

4636閲覧

not null制約をかけているnameカラムに対して空白のままデータを挿入しようとすると「名前なし」と登録される

GenkiSugiyama

総合スコア86

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/07/22 14:38

Ruby on Rails5速習実践ガイドでRailsについて学んでいます。

現在5章Rspecについての学習を行なっているのですが、SystemSpecファイルに表題の内容で(not null制約のnameカラムに対し空白のまま登録)エラーを期待するテストを書いて実行したところ、not nullに引っかかることなく登録されてしまいました。

rails sでアプリの挙動をブラウザで確認しても登録できていました。

なぜnot null制約をかけているはずなのに登録ができてしまうのか教えていただけると幸いです。

【not null制約をかけたマイグレーションファイル】
20200614061232_change_tasks_name_not_null.rb

class ChangeTasksNameNotNull < ActiveRecord::Migration[5.2] def change change_column_null :tasks, :name, false end end

【マイグレーションの状況】

Status Migration ID Migration Name -------------------------------------------------- up 20200506094649 Create tasks up 20200614061232 Change tasks name not null up 20200614063610 Change tasks name limit30 up 20200614080657 Create users up 20200707004117 Add admin to users up 20200715004506 Add user id to tasks

【エラーとなったテスト箇所】

describe 'タスク管理機能', type: :system do let(:user_a) { FactoryBot.create(:user, name: 'ユーザーA', email: 'a@example.com') } let(:user_b) { FactoryBot.create(:user, name: 'ユーザーB', email: 'b@example.com') } let!(:task_a) { FactoryBot.create(:task, name: '最初のタスク', user: user_a) } before do visit login_path fill_in 'メールアドレス', with: login_user.email fill_in 'パスワード', with: login_user.password click_button 'ログインする' end describe '新規作成機能' do let(:login_user) { user_a } before do visit new_task_path fill_in '名称', with: task_name click_button '登録する' end context '新規作成画面で名称を入力しなかった時' do let(:task_name) { '' } #↓以下のテストが通らなかった it 'エラーとなる' do # withinで指定した要素の中のみで期待した要素が存在するかをチェックする within '#error_explanation' do expect(page).to have_content '名称を入力してください' end end end end end

【テストエラー時のスクリーンショット】
イメージ説明

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

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

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

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

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

guest

回答2

0

ベストアンサー

not null制約のnameカラムに対し空白のまま登録

NULLと空文字列は(Oracleなど例外はありますが)別物なので、not nullであっても空文字列の登録は可能です。

Railsレベルでvalidates presence: trueを適用する、あるいはフォームにrequiredをセットするなど、別なレベルでの対応が必要です(参考)。

投稿2020/07/22 22:52

maisumakun

総合スコア146018

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

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

GenkiSugiyama

2020/07/23 07:28

ご回答ありがとうございます。 taskモデルのファイルを確認したところ、「空文字の場合は『名前なし』」というメソッドを記述していました・・・ class Task < ApplicationRecord # 検証前コールバックを追加する before_validation :set_nameless_name private def set_nameless_name self.name = "名前なし" if name.blank? end end こちらの処理をコメントアウトした上で再度実行したところ、空文字では登録できなくなりテストが通りました。 ご指摘いただきありがとうございました!
guest

0

おそらく、サーバー側で null ではなく空文字として扱われて
not null 制約をすり抜けて登録されているのではないでしょうか?

投稿2020/07/22 14:57

y_shinoda

総合スコア3272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問