2010-10-18 103 views
3

我注意到我的应用程序自动将所有进程设置为在创建完成后立即完成。我翻遍了它,找不到为什么日期没有被告知更新,但我发现我的一个观点是寻找一个不存在的领域。我创建了'完整'字段,将其设置为非空布尔值并再次尝试。rails列不能为空:

我正在将它自动设置为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, '', '[email protected]', 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"=>"[email protected]", 
"alias"=>"test1", 
"model_id"=>"1"}, 
"commit"=>"Submit", 
"authenticity_token"=>"cMMf0zS/5jPExlXqVPaYVXndqPeVkm+OQ/WEPIYd2+g=", 
"disposition"=>"Dispose", 
"complete"=>"false", 
"storage"=>"Local", 
"contract_maintenance"=>"0"} 

当我把我的创建控制器它呈现 '真' 下面:

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

是在你的*退役*迁移'complete'列类型一个'boolean'? – 2010-10-18 00:59:23

+0

是的,我也测试过使用tinyints代替'false',但那也不起作用 – Rumpleteaser 2010-10-18 01:14:47

+1

您的模型有一个名为'complete'的方法吗? – zetetic 2010-10-18 04:13:34

回答

0

@zetetic,我改名这一点,但问题仍然存在。发生下列所有值

问题: “处置”=> “处置”, “完成”=> “假”, “存储”=> “本地”, “contract_maintenance”=>” 0“

这些值是使用标准格式选择器而不是导轨格式选择器接收的。这是我能找到的唯一共同点。我最终运行了一些实验性测试,发现这些值并不是与解除对象一起存储的,而是它们自己的。

所以在控制我跑了几个额外的线路,以停止使用对象中设置的值等于与它相关的参数:

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

你可能强制实施数据库约束,该列不能包含NULL值,通过迁移中的某些内容可以:

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

你可能也想在列的默认值是false而非NULL

我个人做每当我添加到总是设置:default => false一个布尔列的习惯(或真),这有助于避免在范围等中检查true或false的逻辑错误,如果您没有正确设置,忘记该值有时可能为空。

可以确认是这是从一个MySQL提示的问题:

mysql> show indexes from decommissions; 

尚应符合Non_unique设置为0,完全Column_name指数。

为了解决这个问题,你可以添加一个迁移的表演:

我也有称为完全的方法

change_column_default(:decommissions, :complete, false) 
+0

看一看params散列,它有'complete => false',所以他没有试图将列设置为NULL。不知怎的,INSERT被错误地创建(使用NULL而不是“false”或“0”)。 – zetetic 2010-10-18 05:43:28

+0

没错,那看起来很奇怪。 – Jeremy 2010-10-18 08:08:31