我使用Timeliness作为验证日期
user.rb
class User < ApplicationRecord
validates_datetime :access_date, :after => Time.now
end
及时性添加区域设置
en:
errors:
messages:
invalid_date: "is not a valid date"
invalid_time: "is not a valid time"
invalid_datetime: "is not a valid datetime"
is_at: "must be at %{restriction}"
before: "must be before %{restriction}"
on_or_before: "must be on or before %{restriction}"
after: "must be after %{restriction}"
on_or_after: "must be on or after %{restriction}"
validates_timeliness:
error_value_formats:
date: '%Y-%m-%d'
time: '%H:%M:%S'
datetime: '%Y-%m-%d %H:%M:%S'
包含restrictions
在我的示例中,如果提供的access_date
位于Time.now
之前 - 来自区域设置的variabla %{restrictions}%
将获得Time.now
值
Time.now是UTC日期,没关系,我想用UTC验证日期 但我想在另一个时区给出错误信息。
在我的控制器中,我在字符串2018-06-17 13:58:34 +0200
中得到时间。我将其转换为UTC,然后保存。我收集偏移量“+0200”,在将值返回View
之前,我必须重写@user.errors.messages[:access_date]
并将String value
内的日期转换为收集的偏移量。这样做似乎很荒谬。
另一种方法
@user.errors.details[:access_date]
[{:error=>:after, :restriction=>"2018-06-17 11:58:34"}]
我可以更改i18n的restriction
值但仍然可以对Time.now进行验证吗?
如何在模型中访问offset
?我从控制器中的params[user][access_date]
中提取了这个值(偏移量)
我不想全局更改区域,我想确保一切都在UTC中工作,只有输出应该在不同的时区。我在同一个请求中收集该时区。
我的肮脏解决方案
我知道它看起来很难看
我检查user.valid?
if false
然后我使用此功能编辑输出
def convert_utc_errors_to_local(access_date_datetime)
if @user.errors.messages[:access_date].present? && @user.errors.details[:access_date].present?
error_keys = [:is_at, :before, :on_or_before, :after, :on_or_after]
@user.errors.details[:access_date].each_with_index do |err, index|
if error_keys.include?(err[:error])
error_text = @user.errors.messages[:access_date][index]
converted_date = err[:restriction].to_datetime.utc.getlocal(access_date_datetime.utc_offset)
@user.errors.messages[:access_date][index] = error_text.concat(converted_date.to_s)
end
end
end
end
我从区域设置%{restriction}%
删除所以现在看起来像
after: "must be after "