2009-04-30 6 views
0

J'ai rencontré un problème lors de l'utilisation d'une relation un à plusieurs. Je veux que chaque série ait un éditeur et qu'un éditeur ait plusieurs séries.Obtention d'une erreur NameError avec ActiveRecord et relations

Ceci est mon modèle Editeur:

class Publisher < ActiveRecord::Base 
    validates_presence_of :name 
    has_many :series 
end 

Ceci est mon modèle Série:

class Serie < ActiveRecord::Base 
    belongs_to :publisher 
end 

C'est le test défaillant:

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.

Depuis que je commence juste avec Rails et Ruby, je suis perdu ici. Qu'est-ce que je fais mal?

+0

J'ai renommé la relation has_many en série et lors de l'enregistrement de la série, la relation fonctionne. Mais je veux avoir la série de noms au lieu de série. –

Répondre

1

Pour répondre à votre question réelle comme mentionné dans votre commentaire (comment puis-je nommer mon modèle « série »?), vous devez faire des rails au courant Inflector de cette exception à ses règles par défaut pluriel des noms.

Ajouter ce qui suit à config/environment.rb:

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.uncountable 'series' 
end 

Cela vous permettra de nommer votre modèle comme Series. Vous pouvez tester qu'il a travaillé à l'aide script/console:

>> "series".pluralize #=> "series" 
>> "series".singularize #=> "series" 

— Je dois dire que je viens essayé d'utiliser The Pluralizer et il semblerait que Rails a connaissance de la façon de traiter le mot série intégré. Try it for yourself.

+0

Le nom du modèle est Serie (au singulier) mais le nom que je souhaite utiliser dans le modèle Publisher est la série (pluriel). –

+0

Je comprends cela, mais le nom du modèle devrait être Series parce que c'est la forme singulière correcte du mot Series. –

+0

Ah, c'est vrai. Merci. Cela fonctionne maintenant comme je le veux. –

1

Je crois que la réponse de John est la meilleure.

Vous pouvez également spécifier directement le nom de classe dans la déclaration has_many

has_many :series, :class_name => 'Serie' 
+0

J'étais sur le point de poster cette réponse. Mais cela n'explique pas pourquoi mon code n'est pas accepté. Selon moi, le code suit les conventions. Je préférerais ne pas inclure le nom de classe là. –

1

Votre nom de relation has_many est bien, mais le nom de votre modèle est faux. Comme le singulier et le pluriel des séries sont les deux séries, vous devez renommer votre modèle de la série à la série. Après ça, tout devrait bien se passer.

Questions connexes