Rails 3:如何验证允许空格(“”)但不是nil(数据库中为NULL)

时间:2012-09-12 20:27:55

标签: ruby-on-rails-3 activerecord

在ActiveRecord(或ActiveModel)中,我希望以下规范传递

it { should allow_value("").for(:my_string) }
it { should_not allow_value(nil).for(:my_string) }

我试过了

validates :my_string, {
  :length => { :in => 0..255 },
  :presence => true,
  :allow_blank => true,
  :allow_nil => false,
}

以及

validates :my_string, {
  :length => { :in => 0..255 },
  :allow_blank => true,
  :allow_nil => false,
}

但是它既可以允许“”也可以不包含任何一种颜色。

6 个答案:

答案 0 :(得分:35)

这对我有用

  validates :my_string, length: { in: 0..255, allow_nil: false }

如果您只想验证该字段不是null,但不关心空/空字符串,则可以正常工作:

  validates :my_string, length: { minimum: 0, allow_nil: false, message: "can't be nil" }

答案 1 :(得分:6)

您可能需要为此进行自定义验证:

validates :my_string, :length => { :in => 0..255 }
validate :my_string_is_valid

def my_string_is_valid
  self.errors.add :base, 'My string can not be nil' if self.my_string.nil? 
end

答案 2 :(得分:6)

您可以尝试:

validates :my_string, exclusion: { in: [nil]}

它是ActiveRecord中验证的一部分。

我已经尝试了其他人,所有人都非常恭敬,或者也允许没有。

答案 3 :(得分:1)

或者也许:

validates :my_string, :length => { :in => 0..255 }, :allow_nil => false

似乎allow_nil未覆盖allow_blank。 所以你最好不要指定allow_blank

答案 4 :(得分:1)

您可以创建一个简单的自定义验证器(放置在app/validators dir中)

class NotNilValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, value)
    record.errors[attribute] << "must not be nil" if value.nil?
  end
end

然后

validates :my_string, not_nil: true

答案 5 :(得分:0)

这对我有用:

validates_exclusion_of :my_string, in: [nil]