NameError:未初始化的常量Feed :: FeedsPost,用于多对多关系

时间:2014-09-26 15:03:53

标签: ruby-on-rails ruby-on-rails-4

我有一个用户模型:

has_one :feed

Feed模式:

belongs_to :user
has_many :feeds_posts
has_many :posts, :through => :feeds_posts

帖子模型:

belongs_to :user    
has_many :feeds_posts
has_many :feeds, :through => :feeds_posts

和feeds_posts模型:

belongs_to :feed
belongs_to :post

然而,当我尝试在控制台中运行以下代码时,我得到以下失败(在为用户提供该用户的订阅源之后)。

user.feed.posts
2.1.1 :004 > user.feed.posts
NameError: uninitialized constant Feed::FeedsPost

我做错了什么?

1 个答案:

答案 0 :(得分:0)

您错误地命名模型;您的FeedsPosts模型必须被称为FeedsPost可能应该被称为FeedPost。它是单数的东西,而不是东西的集合,Rails依赖于这个约定。

Rails依赖于某些约定来自动连接关联。您的has_many仅向Rails提供了这么多信息:feeds_posts。没有任何东西可以将它与实际模型联系起来,所以Rails必须猜测。它通过假设您遵循根深蒂固的约定来实现这一点,在这种情况下,关联应该是复数(" feed_posts")并且模型应该是单数的(" FeedPost") 。由于您已将模型命名为FeedsPosts,因此Rails猜错了,并尝试访问一个名为FeedsPost的类,该类并不存在。

可以偏离此约定并继续使用您当前的名称,但您必须手动指定关联模型的名称:

has_many :feeds_posts, class_name: 'FeedsPosts'

请注意,这是错误的解决方案 - 不要放弃Rails'命名约定,除非你真的有充分的理由这样做。