3

J'ai une application Rails 3.1 avec les 2 modèles suivantsrails problème inflexion 3.1

class Listing < ActiveRecord::Base 
    has_many :listing_saves 
end 

class Team < ActiveRecord::Base 
    has_many :listing_saves 
    has_many :saved_listings, through: :listing_saves, source: 'listing' 
end 

Le modèle Adhérez ressemble à ce

class ListingSave < ActiveRecord::Base 
    belongs_to :team 
    belongs_to :listing 
end 

Mow Je pense qu'il ya un problème d'inflexion, car chaque fois que je essayer d'exécuter mes tests je reçois l'erreur suivante (ceci est un exemple d'erreur et le test qui l'a causé)

it "should return the listing saves associated with the team" do 
    save = Factory :listing_save, listing: @listing, saver: @user, team: @team 
    @team.listing_saves.should include save 
end 

Failures: 

    1) Team listing_saves associations should return the listing saves associated with the team 
    Failure/Error: @team.listing_saves.should include save 
    NameError: 
     uninitialized constant Team::ListingSafe 
    # ./spec/models/team_spec.rb:55:in `block (3 levels) in <top (required)>' 

comme si Rails est singularisation listing_saves dans listing_safe

Voici (aucun d'entre eux travaillent)

# config/initializers/inflections.rb 
ActiveSupport::Inflector.inflections do |inflect| 
    inflect.plural 'saved_listing', 'saved_listings' 
    inflect.singular 'saved_listings', 'saved_listing' 
    inflect.plural 'listing_save', 'listing_saves' 
    inflect.singular 'listing_saves', 'listing_save' 
    inflect.singular 'listing_safes', 'listing_safe' 
    inflect.plural 'listing_safe', 'listing_safes' 
    inflect.irregular 'listing_save', 'listing_saves' 
    inflect.irregular 'saved_listing', 'saved_listings' 
end 

quelques Inflecteur personnalisés que j'ai essayé (pas tous en même temps) Que puis-je faire?

Note: Je trouve la this similar question mais la réponse ne semble pas résoudre mon problème

Modifier J'ai suivi la réponse ci-dessous pour que j'ai maintenant ce qui suit dans mon config/initializers/inflections.rb

ActiveSupport::Inflector.inflections do |inflect| 
    inflect.irregular 'listing_save', 'listing_saves' 
end 

Lorsque j'ouvre une session de console et exécute "listing saves".singularize je reçois "listing_save" comme j'espère. Cependant, il semble qu'au moins une partie de mon application ne l'obtienne pas, mes tests échouent toujours de la même manière qu'avant. (Je jure que je redémarre mon serveur et spork avant de tester/exécuter l'application!).

Edit 2 j'ai écrit quelques tests pour flexions dans mon application:

describe "inflection" do 
    it "should singularize listing_saves properly" do 
    "listing_saves".singularize.should == "listing_save" 
    end 

    it "should pluralize listing_save properly" do 
    "listing_save".pluralize.should == "listing_saves" 
    end 
end 

Maintenant, j'ai une situation où ces tests passent bien, mais d'autres tests échouent toujours avec la même erreur que je faisais avant

NameError: 
     uninitialized constant User::ListingSafe 

Même application, même instance spork, mêmes fichiers chargés. Quelque chose de bizarre se passe ici!

+0

Voir mon nouveau commentaire ci-dessous. – Casper

+0

Peut-être question idiote mais ... si ça vous donne autant de problèmes - pourquoi ne pas trouver un autre nom pour cela? ;) –

+0

Haha ouais bien sûr, nous savons tous les deux que je ne peux pas me laisser battre si! –

Répondre

11

Vous devez définir une inflexion irrégulière :

# Test your inflections! 
> "listing_save".pluralize 
=> "listing_saves" # OK! 
> "listing_saves".singularize 
=> "listing_safe" # Ouch :(

# Make it smarter 
ActiveSupport::Inflector.inflections { |i| 
    i.irregular 'listing_save', 'listing_saves' 
} 

# Test again 
> "listing_saves".singularize 
=> "listing_save" # Yay! 

Ruby docs:

------------------------ ActiveSupport::Inflector::Inflections#irregular 
    irregular(singular, plural) 
------------------------------------------------------------------------ 
    Specifies a new irregular that applies to both pluralization and 
    singularization at the same time. This can only be used for 
    strings, not regular expressions. You simply pass the irregular in 
    singular and plural form. 

    Examples: 

     irregular 'octopus', 'octopi' 
     irregular 'person', 'people' 

Edit:

une enquête plus poussée - et il semble que d'autres ont trébuché sur cette même problème aussi (les inflexions ne fonctionnent pas comme prévu avec les associations). Donc, en attendant, vous pouvez définir le nom de la classe manuellement:

has_many :listing_saves, :class_name => "ListingSave" 

Quelqu'un d'autre avec le même problème, et un flexions supplémentaires tweak.Personnellement, je partirais avec le bien :class_name mise à la place:

Issue with custom inflections in Ruby on Rails 3.0.3

+0

Bonne réponse, merci! –

+0

Salut, désolé de rétracter mon acceptation, je n'ai testé que partiellement votre solution jusqu'à aujourd'hui. Bizarrement, cela fonctionne dans la console mais pas dans les tests ou quand je lance l'application. J'ai édité mon OP avec la nouvelle situation. –

+0

Salut .. pas de problème. Il est très probable que Spork ne charge pas le fichier d'inflexions. Exécutez spork avec 'spork -d' pour voir ce qu'il charge, et/ou ajoutez le fichier d'inflexions dans la section de préchargement spork dans' spec_helpers.rb'. Également faire un cas de test qui teste juste l'inflexion. On dirait que vous en avez besoin pour ça! :) – Casper