簡體   English   中英

Rails 數據庫默認值和布爾字段的模型驗證

[英]Rails database defaults and model validation for boolean fields

在 Rails 模型中,我有一個屬性is_subscriber ,當我構建數據庫遷移以將此列添加到數據庫時,我將默認值指定為 false:

t.boolean  "is_subscriber",   :default => false

我還在模型中指定了這個屬性需要存在:

validates :is_subscriber, presence: true

那么為什么在創建模型實例時未指定此屬性時會出現此錯誤?

2012-05-08T21:05:54+00:00 app[web.1]: ActiveRecord::RecordInvalid (Validation failed: Is subscriber can't be blank):

這里

如果你想驗證一個布爾字段的存在(其中真實值是真和假),你會想要使用 validates_inclusion_of :field_name, :in => [true, false] 這是由於 Object#blank? 處理布爾值。 假.空白? # => 真

或以 Rails3 方式

validates :field, :inclusion => {:in => [true, false]}

我已經解決了這個問題:

validates_presence_of :is_subscriber, :if => 'is_subscriber.nil?'

我認為將其包裝在自定義驗證器中會更簡潔。

/app/validators/is_boolean_validator.rb

class IsBooleanValidator < ActiveModel::EachValidator
  def validate_each(record, attribute, parameters)
    if !parameters.in? [true,false]
      record.errors[attribute] << 'This must be true or false.'
    end
  end
end

那么你必須通過將以下內容添加到/config/application.rb來確保它已加載

config.autoload_paths += %W["#{config.root}/app/validators/"]

(不要忘記重新啟動服務器以加載它)

然后您可以更整齊地驗證

validates: :field1, field2, is_boolean: true
validates :column_name, :inclusion => {:in => [true, false]}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM