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

Jar*_*arl 19 activerecord ruby-on-rails-3

在ActiveRecord(或ActiveModel)中,我希望通过以下规范

it { should allow_value("").for(:my_string) }
it { should_not allow_value(nil).for(:my_string) }
Run Code Online (Sandbox Code Playgroud)

我试过了

validates :my_string, {
  :length => { :in => 0..255 },
  :presence => true,
  :allow_blank => true,
  :allow_nil => false,
}
Run Code Online (Sandbox Code Playgroud)

并且

validates :my_string, {
  :length => { :in => 0..255 },
  :allow_blank => true,
  :allow_nil => false,
}
Run Code Online (Sandbox Code Playgroud)

但要么它既允许"",也允许零或不允许.

Chr*_*oom 35

这适合我

  validates :my_string, length: { in: 0..255, allow_nil: false }
Run Code Online (Sandbox Code Playgroud)

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

  validates :my_string, length: { minimum: 0, allow_nil: false, message: "can't be nil" }
Run Code Online (Sandbox Code Playgroud)


小智 7

你可以试试:

validates :my_string, exclusion: { in: [nil]}
Run Code Online (Sandbox Code Playgroud)

它是ActiveRecord中验证本身的一部分.

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


wee*_*HIS 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
Run Code Online (Sandbox Code Playgroud)

  • 这就是我所做的......但是我发现Rails不支持这种情况很奇怪. (2认同)