2009-11-24 5 views
2

Je viens de configurer quelques modèles de base en utilisant échafaudage avec Rails, j'ai modifié les vues de sorte que je prenne une entrée d'un champ de texte et une boîte de sélection. Voici quelques extraits de code:Erreur de validation des rails avec les balises select

form_for(@town) do |f|
f.text_field :name
.
.
f.select :county_id, @counties.map{|c| [c.name, c.id]}
.
.
end

En utilisant la méthode de validation « validates_presence_of » pour le champ de texte et aucune validation sur la boîte de sélection, je peux entrer des valeurs et écrire avec succès à la base de données. Lorsque je tente de tester la validation par ne pas entrer quoi que ce soit dans le champ de texte, je reçois un NoMethodError avec le message suivant

You have a nil object when you didn't expect it! You might have expected an instance of Array. The error occurred while evaluating nil.map

Note: il n'y a pas de validation sur la boîte de sélection

Si je commente la Ligne "validate_presence_of" Je peux écrire des données vierges sur la base de données sans problème. Toutefois, si j'écris un code de validation pour le champ de texte et que l'objet de formulaire entier devient nul apparemment ... la validation de Rails provoque-t-elle cela?

Toutes les pensées/commentaires sont grandement appréciés. Im using Rails 2.3.4

+0

Où l'erreur se produit-elle? Cela se produit-il dans le contrôleur, la vue ou le modèle? Sur quelle ligne? Qu'est-ce que vous essayez exactement de faire qui déclenche l'erreur? – EmFi

Répondre

5

Vous n'avez pas publié la trace de pile, mais je suppose que l'erreur se produit lorsque vous appelez map sur @counties.

Vous avez probablement deux actions dans votre contrôleur gérant le formulaire. Un (new ou edit) montre le formulaire et répond aux demandes. L'autre (create ou update) effectue la création ou la mise à jour du modèle. Cela répond aux demandes de publication ou de mise et redirigera en cas de succès ou rendra l'action new ou edit en cas d'erreurs de validation (si save échoue).

Je prévois que votre action new ou edit a du code qui attribue à @counties. Votre action create ou update doit également affecter @counties lorsque save échoue pour qu'il soit disponible dans la vue.

+0

Hé les gars, excuses pour l'ambiguïté dans ma question, je n'ai pas compris que 'create' appelait' new.html.erb' quand l'enregistrement a échoué. J'ai vérifié cela à partir de la trace. J'ai mis à jour créer afin qu'il assigne à @counties. Merci Phil, je devrais vraiment changer mon nom pour railsnewb9999 – gcahill

1

Dans votre nouvelle méthode, comment créez-vous @counties et que mettez-vous dans cette variable? Aussi, sans voir vos nouvelles méthodes et créer, il est quelque peu difficile de dire exactement ce qui se passe. Avez-vous cette erreur lorsque vous essayez d'accéder à la page ci-dessus ou lorsque vous essayez de soumettre le formulaire?

Pour ce que ça vaut, vous n'avez pas de validation sur les objets du formulaire, vous avez des validations sur les attributs du modèle. En tant que tel, vous devez vérifier les paramètres qui sont transmis à votre contrôleur lorsque vous soumettez votre formulaire et assurez-vous que vous obtenez ce que vous attendez. Puis faites correspondre ces paramètres aux différentes méthodes validates_ que vous avez dans votre modèle.

Le débogage est un simple cas de première vérification pour s'assurer que votre formulaire et ses données sont corrects et que les paramètres envoyés à votre contrôleur sont corrects. Rappelez-vous, vous devez vérifier à la fois la clé et la valeur. Utilisez également script/console et essayez de créer quelques objets modèles en utilisant les données que vous attendez que votre formulaire envoie et voyez ce qui se passe.

+0

Mon code de validation est juste une ligne dans town.rb "validates_presence_of: name". Quand je change la boîte de sélection à un champ de texte la validation fonctionne correctement mais quand je la change de nouveau elle casse. J'ai essayé de prendre '@ counties.map {| c | [c.name, c.id]} 'code hors de la vue et le plaçant dans le contrôleur mais je reçois alors une erreur' L'erreur s'est produite lors de l'évaluation de nil.inject'. J'ai essayé d'utiliser script/console comme vous l'avez mentionné mais en vain – gcahill

+0

Mais qu'est-ce que @counties? Montrez-nous le code que vous utilisez pour le créer? Votre problème est que ce que vous avez dans @counties n'est pas ce que le select attend. Je ne pense pas que cela ait quelque chose à voir avec votre validation. –

1

Voir this question

Votre problème est symptôme de la même chose.

Questions connexes