【问题标题】:Rails model default_value method conflict with presence trueRails 模型 default_value 方法与存在 true 冲突
【发布时间】:2015-03-15 13:25:49
【问题描述】:

我有这个简化的模型:

class Contract < ActiveRecord::Base

  belongs_to :user   belongs_to :plan

  before_validation :set_default_is_voided   
  before_validation :set_default_expiration

  validates :user, presence: true
  validates :plan, presence: true
  validates :contract_date, presence: true
  validates :is_voided, presence: true
  validates :expiration, presence: true

  protected

  def set_default_is_voided
    if self.is_voided.nil?
      self.is_voided = false
      ap self.is_voided.present?
      ap self.is_voided
    end
  end

  def set_default_expiration
    if self.contract_date.present?
      self.expiration = self.contract_date+1.month
    end
  end

end

而这个 rspec 简化了测试:

context "Should create default values" do
  it "Have to create is_voided" do
    user = FactoryGirl.create(:user)
    plan = FactoryGirl.create(:planContract)
    ap "HERE"
    contractDefault = FactoryGirl.create(:contractDefault, plan: plan, user: user)
    ap contractDefault
    expect(contractDefault.is_voided).to eq(false)
  end
  it "Have to create expiration" do
    #expect(contract.expiration).should eq(Date.today()+1.month)
  end
end

工厂女孩:

FactoryGirl.define do
  factory :contractVoid, class:Contract do
  end
  factory :contractDefault, class:Contract do
    contract_date Date.today
  end
end

此测试失败并显示“is_voided can't be blank”。

问题是: 为什么 before_validation 中的方法“set_default_is_voided”没有通过存在真实验证?此外,self.is_voided.present?返回false,为什么会这样?

【问题讨论】:

    标签: ruby-on-rails rspec


    【解决方案1】:

    您回答了自己的问题,即为什么set_default_is_voided 没有通过presence: true 验证,即self.is_voided.present? 返回false,这是确定presence: true 的方式。

    self.is_voided.present? 返回false,因为false.present? == falseA concise explanation of nil v. empty v. blank in Ruby on Rails

    请参阅Rails: how do I validate that something is a boolean?,了解一种验证布尔字段不是nil 的方法。

    有关blank? 定义背后动机的问答,请参阅http://www.quora.com/Why-does-Rails-make-false-blank-true

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-05-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-10
      • 1970-01-01
      相关资源
      最近更新 更多