【问题标题】:Validation fails - cannot be blank - even though it is not blank验证失败 - 不能为空 - 即使它不为空
【发布时间】:2016-06-16 20:18:19
【问题描述】:

我有模特

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 模型中的实际对象)。

【问题讨论】:

  • 您的CardColour 模型是什么样的?你真的应该尝试使用 Ruby 更加地道一点。尝试使用 belongs_to :card_colourvalidates :card_colour_id, presence: true
  • 能否也显示您的关联和迁移?
  • 我比较新,但有些东西比较混乱:CardColour 似乎是一个合适的模型,也是一个需要填写的列才能使记录有效。
  • 关闭,但使用validates :card_colour, presence: true而不是“card_colour_id”。
  • 列应命名为card_colour_id

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


【解决方案1】:

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

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

【讨论】:

  • 这行得通!谢谢!但它似乎会接受任何整数作为card_colour_id?我以为belongs_to建立外键关系?
【解决方案2】:

请将您的型号代码更改为

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)

【讨论】:

  • 模型类名应该是 CamelCase... 所以belong_to :CardColour 是正确的,不是吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-23
  • 1970-01-01
  • 2017-12-02
  • 1970-01-01
相关资源
最近更新 更多