Ruby on rails ActiveRecord::RecordInvalid(验证失败:Word不能为空)

Ruby on rails ActiveRecord::RecordInvalid(验证失败:Word不能为空),ruby-on-rails,ruby,ruby-on-rails-3,Ruby On Rails,Ruby,Ruby On Rails 3,鉴于此代码: class Word < ActiveRecord::Base has_and_belongs_to_many :definitions end class Definition < ActiveRecord::Base has_and_belongs_to_many :word validates :word, presence: true end mysql> show columns from definitions_words; +----

鉴于此代码:

class Word < ActiveRecord::Base
  has_and_belongs_to_many :definitions
end

class Definition < ActiveRecord::Base
  has_and_belongs_to_many :word
  validates :word, presence: true
end

mysql> show columns from definitions_words;
+---------------+---------+------+-----+---------+-------+
| Field         | Type    | Null | Key | Default | Extra |
+---------------+---------+------+-----+---------+-------+
| definition_id | int(11) | NO   | PRI | NULL    |       |
| word_id       | int(11) | NO   | PRI | NULL    |       |
+---------------+---------+------+-----+---------+-------+
我得到:

ActiveRecord::RecordInvalid (Validation failed: Word can't be blank)

首先:您在定义类上的关系是错误的。它应该是复数形式言语

Second:验证也是错误的。它也应该是复数形式。e、 验证:单词

通过这种方式,它期望一个名为word的字段不是空的,而是关系

尝试将示例代码更改为:

word = Word.first
definition = Definition.new
definition.words = [word]
definition.save

为什么您希望它能工作?在我看来是可以的,应该可以工作。为什么您认为不好的命名约定会导致此验证错误?这不是一个不好的命名约定。我只是觉得是拼错了。这就是为什么我建议更改它。我收到:验证失败:单词不能为空。你能发布你所做的迁移吗?这是因为验证。因为u正在验证关联对象,所以在创建时它没有正确设置第一个对象,因为它不是一对一关系。我认为你指定的这种行为没有太多选择。
word = Word.first
definition = Definition.new
definition.words = [word]
definition.save