Rails不允许我提前超过30天设置'date'字段 - Help - Rails 3.0

时间:2011-10-21 03:44:16

标签: ruby-on-rails ruby ruby-on-rails-3

在我的User模型上,我有一个属性trial_end_date

表格中的列如下所示:

#  trial_end_date       :date

但是,如果我尝试将日期更改为远期,那么在Rails控制台上会发生以下情况:

a = User.find(2)
a.trial_end_date = "2019-12-30"
=> "2019-12-30"
>> a.save
=> true
>> a.trial_end_date
=> Sat, 19 Nov 2011

WTF?为什么这样做?我不知道为什么会这样做?

即使我尝试update_attributes(:trial_end_date => "2019-12-30"),也会发生同样的事情。

以下是我的User模型中与trial_end_date相关的所有方法:

after_validation :set_trial_end

   def has_trial_expired?
        if (self.trial_end_date <= Date.today)
            return true
        else
            return false
        end
    end

    def set_trial_end
      plan = self.plan
      end_of_trial = Date.today + self.plan.trial_duration.days
      self.trial_end_date = end_of_trial.to_date
    end

    def trial_will_almost_end?
        if (self.trial_end_date - Date.today <= 3)
            return true
        else
            return false
        end
    end

    def when_does_trial_end?
        self.trial_end_date
    end

3 个答案:

答案 0 :(得分:2)

验证后,trial_end_date会根据计划持续时间设置,不是吗?

答案 1 :(得分:2)

marcamillion,

您评论说您认为验证将“仅在初始用户创建时发生”。正如评论所指出的那样,如果你使用after_validation则不然,但是如果你使用

则是真的
before_validation_on_create

(例如,参见http://ar.rubyonrails.org/classes/ActiveRecord/Callbacks.html

使用它会限制用户的日期创建,但不会阻止您(或者他们!小心!)以后以其他方式更改它们。

答案 2 :(得分:1)

鲍勃回答的一个改进:* _on_create及其同类在3.0中弃用,在3.1中删除。为了可维护性,您可能希望采用新形式:

before_validation :some_method, :on => :create

这是一个快速的调整,可以帮助你避免将来的头痛。