2010-10-18 7 views
3

J'ai remarqué que mon application mettait automatiquement tous mes processus à exécution dès qu'ils ont été créés. J'ai regardé à travers, je ne pouvais pas trouver pourquoi la date était mise à jour sans qu'on me le dise, mais j'ai trouvé que l'un de mes points de vue cherchait un domaine qui n'existait pas. J'ai créé le champ 'complete', l'ai défini comme un booléen non nul et j'ai essayé à nouveau. Je recommençais à le définir automatiquement à true, donc j'ai essayé de le définir comme faux explicitement dans la méthode create, cela ne fonctionnait toujours pas: S j'ai donc essayé de mettre un champ caché dans le formulaire. Je reçois maintenant une erreur "colonne ne peut pas être nulle" même si la valeur est fournie.rails La colonne ne peut pas être nulle:

Comme vous pouvez le voir il y a clairement un paramètre pour la valeur complète. Qu'est-ce que je rate?

erreur:

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') 

Paramètres:

{"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"} 

Quand je mets ce qui suit dans mon contrôleur créer, il rend 'vrai':

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

est le type de colonne pour 'complete' dans votre * Déclassement * migration un 'booléen'? –

+0

oui c'est, j'ai aussi testé en utilisant tinyints à la place de 'faux' mais cela n'a pas fonctionné non plus – Rumpleteaser

+1

Votre modèle a-t-il une méthode nommée 'complete'? – zetetic

Répondre

0

@zetetic

J'ai eu une méthode appelée complète, je renomme cela, mais le problème était toujours en cours.

Le problème est survenu pour toutes les valeurs suivantes: "disposition" => "Éliminer", "complète" => "false", "stockage" => "Local", "contract_maintenance" => » 0 "

Ces valeurs ont été reçues en utilisant des sélecteurs de forme normale plutôt que des rails. C'était la seule chose que je pouvais trouver qu'ils avaient en commun. J'ai fini par faire des tests expérimentaux et j'ai découvert que les valeurs n'étaient pas stockées avec l'objet de déclassement, mais plutôt dans le leur.

Ainsi, dans le contrôleur j'ai couru quelques lignes supplémentaires pour définir les valeurs dans l'objet désaffectation pour égaler les paramètres qui y sont associés:

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

Vous avez probablement imposé un contrainte de base de données que la colonne ne peut pas contenir une valeur NULL via quelque chose dans une migration comme:

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

Vous voudrez probablement aussi la valeur par défaut de la colonne à false plutôt que NULL

Personnellement, je fais une habitude de chaque fois que j'ajouter une colonne booléenne toujours définie :default => false (ou vrai), ce qui permet d'éviter les bogues logiques lorsque vous vérifiez les valeurs true ou false dans les oscilloscopes, etc., en oubliant que la valeur peut parfois être nulle, si vous ne le définissez pas correctement.

Vous pouvez confirmer c'est la question à partir d'une invite de mysql:

mysql> show indexes from decommissions; 

il devrait y avoir un index avec Non_unique ensemble à 0 et Column_name de complet.

Pour résoudre ce problème, vous pouvez ajouter une exécution de migration:

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

Jetez un oeil au hash de params, il a 'complete => false', donc il n'essaye pas de mettre la colonne à NULL. D'une manière ou d'une autre, l'INSERT est créé de manière incorrecte (en utilisant NULL au lieu de "false" ou "0"). – zetetic

+0

Ah vrai, cela semble étrange alors. – Jeremy

Questions connexes