Ruby on rails Rails验证三种类型的日期格式

Ruby on rails Rails验证三种类型的日期格式,ruby-on-rails,ruby-on-rails-3,validation,customvalidator,Ruby On Rails,Ruby On Rails 3,Validation,Customvalidator,我正在开发一个RubyonRails应用程序,它使用一种特殊的日期格式。 所讨论的日期格式为Year.month.day,日期可以是: 年、月、日 年月 年 我正在研究一种验证方法,该方法必须检查格式,如果输入日期符合其中任何一种格式,则使其有效。到目前为止,我的代码是: def data_format_correct regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/ regexym = /[0-9]{4}[.][0-9]{1,2}/ regexy

我正在开发一个RubyonRails应用程序,它使用一种特殊的日期格式。 所讨论的日期格式为Year.month.day,日期可以是:

年、月、日 年月 年

我正在研究一种验证方法,该方法必须检查格式,如果输入日期符合其中任何一种格式,则使其有效。到目前为止,我的代码是:

def data_format_correct
regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/
regexym = /[0-9]{4}[.][0-9]{1,2}/
regexy = /[0-9]{4}/
if :data.to_s =~ regexymd
  return true
elsif  :data.to_s =~ regexym
  return true
elsif :data.to_s =~ regexy
  return true
else
  errors.add(:data)
  return
end
结束

每次我在表单中输入日期时,else的情况会随着错误而增加。我很确定我的代码是正确的。我错过什么了吗

编辑:

找到了解决办法。工作原理如下:

regexymd = /^[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}$/
regexym = /^[0-9]{4}[.][0-9]{1,2}$/
regexy =  /^[0-9]{4}$/
regex_final = Regexp.union(regexymd, regexym)
regex_final = Regexp.union(regex_final, regexy)

validates :data, :format => { :with => regex_final }
def data_format_correct
  regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/
  regexym = /[0-9]{4}[.][0-9]{1,2}/
  regexy = /[0-9]{4}/
  if regexymd.match(data.to_s)
    return true
  elsif  regexym.match(data.to_s) 
    return true
  elsif regexy.match(data.to_s) 
    return true
  else
    errors.add(:data)
    return
  end
end

希望这能帮助和我处境相同的人。谢谢你的回答。我很感谢您的反馈。

您没有匹配变量
数据
,而是匹配符号
:data
,这就是它引发错误的原因(顺便说一句,如果您可以发布错误,这将非常有用)

不管怎样,我想你想要的是这样的:

regexymd = /^[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}$/
regexym = /^[0-9]{4}[.][0-9]{1,2}$/
regexy =  /^[0-9]{4}$/
regex_final = Regexp.union(regexymd, regexym)
regex_final = Regexp.union(regex_final, regexy)

validates :data, :format => { :with => regex_final }
def data_format_correct
  regexymd = /[0-9]{4}[.][0-9]{1,2}[.][0-9]{1,2}/
  regexym = /[0-9]{4}[.][0-9]{1,2}/
  regexy = /[0-9]{4}/
  if regexymd.match(data.to_s)
    return true
  elsif  regexym.match(data.to_s) 
    return true
  elsif regexy.match(data.to_s) 
    return true
  else
    errors.add(:data)
    return
  end
end

你能在异常回溯中通过吗?找到了!我使用regexp.join将三个regexp合并为一个,然后将结果传递给validates:data,:format=>{with=>result}。成功了。我将发布解决方案。谢谢你的回复顺便说一句。我感谢你的反馈:-D