3 votes

Comment résoudre l'erreur `Object doesn't support #inspect` ?

J'utilise rails v3.2.2 et j'obtiens une erreur étrange lorsque j'essaie de charger les enregistrements associés.

Voici l'entrée/sortie du terminal que j'obtiens :

1.9.2-p318 :011 > Category.first
=> #<Category id: 1, ...>

1.9.2-p318 :013 > Category.first.articles
  Article Load (0.2ms)  SELECT `articles`.* FROM `articles` LIMIT 1
(Object doesn't support #inspect)

1.9.2-p318 :014 > Category.first.articles.first
  Category Load (0.2ms)  SELECT `categories`.* FROM `categories` LIMIT 1
NoMethodError: undefined method `scoped' for Category::Article:Module
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/association.rb:123:in `target_scope'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/through_association.rb:15:in `target_scope'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/association.rb:87:in `scoped'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_association.rb:569:in `first_or_last'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_association.rb:101:in `first'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/activerecord-3.2.2/lib/active_record/associations/collection_proxy.rb:46:in `first'
    from (irb):14
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands/console.rb:47:in `start'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands/console.rb:8:in `start'
    from /<USER_PATH>/.rvm/gems/ruby-1.9.2-p318/gems/railties-3.2.2/lib/rails/commands.rb:41:in `<top (required)>'
    from script/rails:6:in `require'
    from script/rails:6:in `<main>'

Dans mon Category modèle que j'ai :

class Category < ActiveRecord::Base
  has_many :article_relationships,
    :class_name  => 'Category::Article::ArticleRelationship',
    :foreign_key => 'category_id'

  has_many :articles,
    :through     => :article_relationships,
    :source      => :article
end

Dans mon Category::Article::ArticleRelationship Je l'ai fait :

class Category::Article::ArticleRelationship < ActiveRecord::Base
  belongs_to :article,
    :class_name    => 'Article',
    :foreign_key   => 'article_id'
end

Comment résoudre le problème lié à Object doesn't support #inspect ?


Note : Dans le même Category j'ai une déclaration similaire comme pour Category::Article::ArticleRelationship (il est lié à un User par l'intermédiaire d'un Category::UserRelationship ) et cela ne pose pas de problème.

5voto

Frederick Cheung Points 38410

Il existe deux constantes appelées Article sur votre application. L'une est votre classe d'enregistrement actif, une constante de haut niveau. L'autre est le module Category::Article .

Lorsque vous le faites belongs_to :article Il semblerait donc que les rails commencent à chercher un Article dans la classe à partir de laquelle le belongs_to est appelé, ce qui fait qu'il trouve la mauvaise constante. Cela entraîne toutes sortes de problèmes, car il est évident que l'on ne peut pas utiliser indifféremment une classe activeecord et un module

Paramètres :class_name => '::Article' force le niveau supérieur Article à la place.

5voto

user3136539 Points 51

Si vous utilisez rails 4, le problème vient de la gemme protected_attributes, vous devez mettre à jour la gemme version 1.0.3 à 1.0.5, ensuite cela fonctionnera.

0voto

Backo Points 3087

Le problème semble être résolu en déclarant ce qui suit dans mon Category::Article::ArticleRelationship :

class Category::Article::ArticleRelationship < ActiveRecord::Base
  belongs_to :article,
    :class_name    => '::Article', # note I added '::'
    :foreign_key   => 'article_id'
end

mais je n'ai pas compris pourquoi ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X