Obtenir une erreur NameError avec ActiveRecord et des relations
-
03-07-2019 - |
Question
J'ai rencontré un problème lors de l’utilisation d’une relation un à plusieurs. Je souhaite que chaque série ait un éditeur et qu'un éditeur en possède plusieurs.
Voici mon modèle d'éditeur:
class Publisher < ActiveRecord::Base
validates_presence_of :name
has_many :series
end
Voici mon modèle de série:
class Serie < ActiveRecord::Base
belongs_to :publisher
end
C’est le test qui a échoué:
test "a publisher should have a list of series" do
@publisher = Publisher.new :name => "Standaard Uitgeverij"
@series = [ Serie.new(:name => "De avonturen van Urbanus", :publisher => @publisher),
Serie.new(:name => "Suske en Wiske", :publisher => @publisher) ]
assert_equal @series, @publisher.series
end
Le test échoue sur la dernière ligne avec NameError: constante non initialisée Publisher :: Series.
J'ai essayé de sauvegarder l'éditeur et la série, mais cela n'a pas fonctionné. Je l’ai essayé avec une seule série, mais cela donne la même erreur.
Comme je viens juste de commencer avec Rails et Ruby, je suis désemparé ici. Qu'est-ce que je fais mal?
La solution
Pour répondre à la question mentionnée dans votre commentaire (, comment nommer mon modèle "Série"? ), vous devez créer le Inflector conscient de cette exception à ses règles de pluralisation par défaut.
Ajoutez les éléments suivants à config / environment.rb
:
ActiveSupport::Inflector.inflections do |inflect|
inflect.uncountable 'series'
end
Ceci vous permettra de nommer votre modèle comme Série
. Vous pouvez vérifier que cela fonctionne avec script / console
:
>> "series".pluralize #=> "series"
>> "series".singularize #=> "series"
—Je dois dire que je viens d'essayer d'utiliser The Pluralizer et qu'il semblerait que Rails sait comment gérer le mot série intégré. Essayez par vous-même .
Autres conseils
Je crois que la réponse de John est la meilleure.
Vous pouvez également spécifier directement le nom de la classe dans la déclaration has_many
has_many :series, :class_name => 'Serie'
Votre nom de relation has_many convient, mais votre nom de modèle est incorrect.
Comme le singulier et le pluriel de séries sont les deux séries, vous devez renommer votre modèle de Série en Série. Après cela, tout devrait bien se passer.