我正在处理大量遗留数据,有时日期时间字段为零/空。 这打破了本地化。 除了这样做之外,还有推荐的解决方法吗:
dt = nil
l(dt) unless dt.nil?
我认为有一种更干净的方法来解决这个问题。我在一个名为
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
扩展 Larry K 的答案,
帮助程序应包含一个哈希值以将选项传递给 I18n。
def ldate(dt, hash = {})
dt ? l(dt, hash) : nil
end
这允许您传递如下选项:
= ldate @term.end_date, format: :short
我最近将一个使用 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
它又起作用了!
l(或本地化)方法接受默认值,如果对象为零,则将使用该默认值:
l(nil) # I18n::ArgumentError: Object must be a Date, DateTime or Time object. nil given.
l(nil, default: '') # ''