验证失败 - 不能为空 - 即使它不是空白

时间:2016-06-16 20:18:19

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

我有一个模特

class Card < ActiveRecord::Base
  belongs_to :CardColour
  validates :CardColour, presence:true

在控制台中输入

@a = Card.new(:card_colour_id =1)

然而它无效。我问为什么,做@ a.errors,控制台告诉我

=> #<ActiveModel::Errors:0x000000052e57e8 @base=#<Card id: nil, card_colour_id: 1>, @messages={:CardColour=>["can't be blank"]}> 

我花了好几个小时看着这个,我完全感到困惑,并且在我的智慧结束时为什么我似乎无法在Rails中做最简单的事情。

我查找了类似标题的问题,但它们似乎都是更复杂的场景。我比这个例子更多,但没有更复杂的。例如,我实际上设置了3个外键,并且它们都告诉我它们不能为空,即使它们填充了有效值。

我发现this answer表明我的代码是正确的,并且实际上会执行我想要的操作(即验证card_colour_id链接到CardColour模型中的实际对象)。

2 个答案:

答案 0 :(得分:1)

您正在验证CardColour,但在您的控制台中,您使用Card创建了一个新card_colour_id,但未使用CardColour。这就是你得到错误的原因。

您应该将validates :CardColour, presence :true更改为validates :your_model's_column, presence :true

答案 1 :(得分:0)

请将您的型号代码更改为

class Card < ActiveRecord::Base
  belongs_to :card_colour
  validates :card_colour_id, presence:true

和您的新卡片行

@a = Card.new(:card_colour_id => 1)

或使用新语法

@a = Card.new(card_colour_id: 1)