Столбец rails не может быть нулевым: - PullRequest
4 голосов
/ 18 октября 2010

Я заметил, что мое приложение автоматически устанавливало все мои процессы как завершенные, как только они были созданы. Я просмотрел это, не мог найти, почему дата обновлялась без уведомления, но я обнаружил, что один из моих просмотров искал поле, которое не существовало. Я создал поле 'complete', установил его как ненулевое логическое значение и повторил попытку.

Я снова устанавливал значение true в автоматическое, поэтому я попытался явно установить значение false в методе создания, но это все равно не сработало: S, поэтому я попытался вставить скрытое поле в форму. Теперь я получаю сообщение об ошибке «столбец не может быть пустым», даже если указывается значение.

Как видите, для полного значения явно есть параметр. Чего мне не хватает?

Ошибка:

Mysql::Error: Column 'complete' cannot be null: INSERT INTO `decommissions` (`completed_at`, `keep_backups`, `services_stopped`, `updated_at`, `operating_system_id`, `comments`, `username`, `disposition`, `stakeholder_email`, `complete`, `alias`, `storage`, `model_id`, `contract_maintenance`, `created_at`) VALUES(NULL, 1, 1, '2010-10-18 00:32:37', 1, NULL, NULL, '', 'test@qut.edu.au', NULL, 'test1', '', 1, '', '2010-10-18 00:32:37')

Параметры:

{"decommission"=>{"dns_items_attributes"=>{"0"=>{"ip"=>"131.181.185.111",
 "alias"=>"test",
 "retain"=>"1",
 "_destroy"=>""}},
 "keep_backups"=>"1",
 "services_stopped"=>"1",
 "operating_system_id"=>"1",
 "stakeholder_email"=>"test@qut.edu.au",
 "alias"=>"test1",
 "model_id"=>"1"},
 "commit"=>"Submit",
 "authenticity_token"=>"cMMf0zS/5jPExlXqVPaYVXndqPeVkm+OQ/WEPIYd2+g=",
 "disposition"=>"Dispose",
 "complete"=>"false",
 "storage"=>"Local",
 "contract_maintenance"=>"0"}

Когда я помещаю следующее в свой контроллер создания, оно отображает 'true':

@decommission = Decommission.new(params[:decommission])
@decommission.complete = false
render :text => @decommission.complete

Ответы [ 2 ]

1 голос
/ 18 октября 2010

Вы, вероятно, применили ограничение базы данных, согласно которому столбец не может содержать значение NULL через что-то в миграции, например:

add_column :decommissions, :complete, :boolean, :null => false

Возможно, вам также понадобитсязначение по умолчанию для столбца будет false, а не NULL

Лично у меня есть привычка всякий раз, когда я добавляю логический столбец, чтобы всегда устанавливать :default => false (или true), что помогает избежать логических ошибокгде вы проверяете true или false в областях и т. д., забывая, что значение может иногда быть нулевым, если вы не установите его правильно.

Вы можете подтвердить, что это проблема из приглашения mysql:

mysql> show indexes from decommissions;

должен быть индекс с Non_unique, установленным в 0 и Column_name завершено.

Чтобы исправить это, вы можете добавить миграцию, выполнив:

change_column_default(:decommissions, :complete, false)
0 голосов
/ 19 октября 2010

@ ищущий

У меня был метод с именем complete, я переименовал его, но проблема все еще возникала.

Проблема возникла для всех следующих значений: "Расположение" => "Утилизировать", "Полный" => "ложь", "Хранение" => "Local", "Contract_maintenance" => "0"

Эти значения были получены с использованием обычных селекторов форм, а не рельсов. Это было единственное, что я мог найти, что у них общего. В итоге я выполнил несколько экспериментальных тестов и обнаружил, что значения хранятся не в объекте вывода из эксплуатации, а в их собственных.

Итак, в контроллере я запустил несколько дополнительных строк, чтобы установить значения в объекте вывода из эксплуатации равными параметрам, связанным с ним:

@decommission.storage = params[:storage]
@decommission.contract_maintenance = params[:contract_maintenance]
@decommission.disposition = params[:disposition]
@decommission.complete = false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...