【问题标题】:Rails 3: How do I validate to allow blanks ("") but not nil (NULL in database)Rails 3:我如何验证允许空白(“”)但不允许空(数据库中的NULL)
【发布时间】:2012-09-12 20:27:55
【问题描述】:

在 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,
}

但要么允许 "" 和 nil 要么都不允许。

【问题讨论】:

    标签: ruby-on-rails-3 activerecord


    【解决方案1】:

    这对我有用

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

    如果您只想验证该字段不为空,但不关心空白/空字符串,则此方法可行:

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

    【讨论】:

      【解决方案2】:

      你可以试试:

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

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

      我已经尝试过其他的,所有这些都非常compliated或也允许nil。

      【讨论】:

        【解决方案3】:

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

        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
        

        【讨论】:

        • 这就是我所做的......但是我发现Rails不支持这种情况很奇怪。
        【解决方案4】:

        您可以创建一个简单的自定义验证器(放在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
        

        【讨论】:

        • 这个也可以写成record.errors.add(attribute, 'must not be nil) if value.nil?
        • 威尔逊的回答缺少结束语。应该是record.errors.add(attribute, 'must not be nil') if value.nil?
        【解决方案5】:

        或许:

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

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

        【讨论】:

        • 尝试您的建议,使it { should_not allow_value(nil).for(:my_string) } 失败。
        • 当您同时拥有presence: true, allow_blank: true, allow_nil: false 时。它将允许 nil
        【解决方案6】:

        这对我有用:

        validates_exclusion_of :my_string, in: [nil]
        

        【讨论】:

        • 欢迎来到 Stack Overflow。您能否添加几句话来帮助解释您的答案?
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-06
        • 1970-01-01
        相关资源
        最近更新 更多