rails i18n - 如何处理传递零日期的情况,即 l(nil)

问题描述 投票:0回答:5

我正在处理大量遗留数据,有时日期时间字段为零/空。 这打破了本地化。 除了这样做之外,还有推荐的解决方法吗:

dt = nil
l(dt) unless dt.nil?
ruby-on-rails
5个回答
22
投票

我认为有一种更干净的方法来解决这个问题。我在一个名为

relaxed_i18n.rb

的初始化程序中猴子修补了 I18n

这是该文件的内容:

module I18n

  class << self

    alias_method :original_localize, :localize

    def localize object, options = {}
      object.present? ? original_localize(object, options) : ''
    end

  end

end

这是我用来验证此方法输出的 RSpec 代码:

require 'rails_helper'

describe 'I18n' do
  it "doesn't crash and burn on nil" do
    expect(I18n.localize(nil)).to eq ''
  end

  it 'returns a date with Dutch formatting' do
    date = Date.new(2013, 5, 17)
    expect(I18n.localize(date, format: '%d-%m-%Y')).to eq '17-05-2013'
  end
end

16
投票

扩展 Larry K 的答案,

帮助程序应包含一个哈希值以将选项传递给 I18n。

def ldate(dt, hash = {})
  dt ? l(dt, hash) : nil
end

这允许您传递如下选项:

= ldate @term.end_date, format: :short

7
投票

不幸的是,没有内置的解决方案。请参阅帖子

您可以定义自己的助手来提供“nil”人类可读值。例如:

def ldate(dt)
  dt ? l(dt) : t("[???]")
end

3
投票

我最近将一个使用 jankeesvw 的宽松 i18n 方法的应用程序更新到 Ruby 3.1,并发现了缺少参数的问题。

I18n gem 中的相关更改是这样的:ruby-i18n/i18n#5eeaad7
此外,Ruby 3 的更改也是相关的:https://www.ruby-lang.org/en/news/2019/12/12/separation-of-positional-and-keyword-arguments-in-ruby-3-0 /

更新了代码:

module I18n
  class << self
    alias original_localize localize

    def localize(object, locale: nil, format: nil, **options)
      object.present? ? original_localize(object, locale: locale, format: format, **options) : ''
    end
  end
end

它又起作用了!


0
投票

l(或本地化)方法接受默认值,如果对象为零,则将使用该默认值:

l(nil) # I18n::ArgumentError: Object must be a Date, DateTime or Time object. nil given.
l(nil, default: '') # ''
© www.soinside.com 2019 - 2024. All rights reserved.