错误覆盖了rails中的i18n

时间:2018-06-17 12:18:31

标签: ruby-on-rails validation time error-handling internationalization

我使用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 "

0 个答案:

没有答案