【问题标题】:ActiveRecord::RecordInvalid (Validation failed: Word can't be blank)ActiveRecord::RecordInvalid(验证失败:Word 不能为空)
【发布时间】:2014-01-03 10:14:40
【问题描述】:

鉴于此代码:

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    |       |
+---------------+---------+------+-----+---------+-------+

当我打电话时:

word = Word.first
word.definitions.create!

我明白了:

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

【问题讨论】:

  • 你为什么期望它可以工作?
  • 我认为没问题,应该可以工作。

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

第一:你在定义类的关系是错误的。应该是复数! :单词

第二:验证也是错误的,也应该是复数。例如验证:单词

这样,它期望名称为word的字段不为空而不是关系。

尝试将示例代码更改为:

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

【讨论】:

  • 为什么你认为糟糕的命名约定会导致这个验证错误?
  • 是一个不错的命名约定。我只是认为这是一个拼写错误。这就是为什么我建议改变它。
  • 我收到:验证失败:单词不能为空
  • 你能发布你所做的迁移吗?
  • 这是因为验证。由于您正在验证关联对象,因此在创建时它并没有正确设置第一个对象,因为它不是一对一的关系。我认为您指定的这种行为没有太多选择。
猜你喜欢
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
  • 2016-08-16
  • 1970-01-01
  • 2016-07-30
  • 1970-01-01
  • 2020-07-11
  • 1970-01-01
相关资源
最近更新 更多