rails列不能为null:

时间:2010-10-18 00:39:48

标签: ruby-on-rails null

我注意到我的应用程序自动将我的所有进程设置为在创建后立即完成。我仔细研究过,找不到为什么日期没有被告知更新,但我发现我的一个观点是寻找一个不存在的字段。我创建了“完整”字段,将其设置为非null布尔值并再次尝试。

我正在将它自动设置为true,所以我尝试在create方法中将其设置为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 个答案:

答案 0 :(得分:1)

您可能强制执行数据库约束,该列不能通过迁移中的某些内容包含NULL值,如:

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

您可能还希望列的默认值为false而不是NULL

我个人养成每当我添加一个布尔列以始终设置:default => false(或true)时的习惯,这有助于避免在范围等中检查true或false的逻辑错误,忘记该值如果你没有正确设置,有时可以为null。

您可以通过mysql提示确认这是问题:

mysql> show indexes from decommissions;

应该有一个索引,Non_unique设置为0,Column_name完成。

要解决此问题,您可以添加迁移功能:

change_column_default(:decommissions, :complete, false)

答案 1 :(得分:0)

@zetetic

我确实有一个名为complete的方法,我将其重命名,但问题仍然存在。

以下所有值都出现问题:  “处置”=> “中处置”,  “完成”=> “中假” 时,  “存储”=> “中本地”,  “contract_maintenance”=> “中0”

这些值是使用普通形式选择器而不是轨道选择器接收的。这是我唯一能找到的共同点。我最终运行了一些实验测试,发现这些值没有与decommission对象一起存储,而是存放在自己的。

所以在控制器中我运行了一些额外的行来设置decommission对象中的值,使其等于与之关联的参数:

@decommission.storage = params[:storage]
@decommission.contract_maintenance = params[:contract_maintenance]
@decommission.disposition = params[:disposition]
@decommission.complete = false