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

时间:2012-02-27 14:52:26

标签: ruby-on-rails

我正在处理大量遗留数据,偶尔datetime字段为nil / null。这打破了本地化。是否有建议的方法来解决这个问题:

dt = nil
l(dt) unless dt.nil?

3 个答案:

答案 0 :(得分:21)

我认为有一种更清洁的方法来解决这个问题。我在名为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 'spec_helper'

describe 'I18n' do

  it "doesn't crash and burn on nil" do
    I18n.localize(nil).should == ''
  end

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

end

答案 1 :(得分:14)

延长Larry K的答案,

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

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

这允许您传递这样的选项:

= ldate @term.end_date, format: :short

答案 2 :(得分:5)

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

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

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