1

我有一个表单,我正在尝试验证名为“生日”的字段不为空,并且日期是 Chronic gem 可以解析的有效日期格式。我总是收到错误消息“生日无效”。我一直在尝试一种简单的格式“10/10/2010”。

我如何验证生日字段是慢性可以解析的格式?

User.rb 模型

class User < ActiveRecord::Base

  validates :birthday, :presence => true
  validate :birthday_is_date
  validate :position, :presence => true

  # validate the birthday format
  def birthday_is_date
    errors.add(:birthday ,Chronic.parse(birthday)) # testing to see the value of :birthday
    errors.add(:birthday, "is invalid test message") if ((Chronic.parse(:birthday) rescue ArgumentError) == ArgumentError)
  end
end

联系人控制器.rb

# POST /contacts/1/edit
    # actually updates the users data
    def update_user
        @userProfile = User.find(params[:id])

        respond_to do |format|
            if @userProfile.update_attributes(params[:user])
                format.html {
                    flash[:success] = "Information updated successfully"
                    redirect_to(profile_path)
                }
            else 
                format.html {
                    flash[:error] = resource.errors.full_messages

                    render :edit
                }
            end
        end
    end
4

3 回答 3

2

您的birthday_is_date验证总是在第一行添加一个错误。应该这样写:

def birthday_is_date
  errors.add(:birthday, "is invalid") unless Chronic.parse(birthday)
end
于 2012-11-07T06:26:55.203 回答
1

试试这个

安装validates_date_time gem

您可以通过日期验证,for example

class Person < ActiveRecord::Base
    validates_date     :date_of_birth
    validates_time     :time_of_birth
    validates_date_time :date_and_time_of_birth
  end
  

使用 :allow_nil 允许该值为空白。

  class Person < ActiveRecord::Base
    validates_date :date_of_birth, :allow_nil => true
  end

来源https ://github.com/smtlaissezfaire/validates_date_time

于 2012-11-07T06:27:51.003 回答
1

来自chronic.rubyforge.org

Chronic 使用 Ruby 内置的 Time 类进行所有时间存储和计算。因此,只有 Time 类可以处理的时间才会被正确解析。解析超出此范围的时间将简单地返回 nil。计划在未来的版本中支持更广泛的时间。

当前不支持本地时区以外的时区。计划在未来的版本中支持其他时区。

Ruby 中使用 Date 对象的日期验证

一个简单的验证函数

测试有效日期的一种方法是尝试创建一个 Date 对象。如果创建了对象,则日期有效,否则,日期无效。这是一个接受年、月和日的函数,如果日期有效则返回 true,如果日期无效则返回 false。

def test_date(yyyy, mm, dd)
   begin
     @mydate = Date.new(yyyy, mm, dd)
     return true
   rescue ArgumentError
     return false
   end
 end

如何验证 Rails 中的日期?

如果您正在寻找插件解决方案,我会检查 validates_timeliness 插件。它的工作原理是这样的(来自 github 页面):

class Person < ActiveRecord::Base
  validates_date :date_of_birth, :on_or_before => lambda { Date.current }
  # or
  validates :date_of_birth, :timeliness => {:on_or_before => lambda { Date.current }, :type => :date}
end 

可用的验证方法列表如下:

validates_date - 将值验证为日期
validates_time - 将值验证为仅时间,即“下午 12:20”
validates_datetime - 将值验证为完整的日期和时间
验证 - 使用 :timeliness 键并在哈希中设置类型。

于 2012-11-07T06:36:41.087 回答