Подтвердить что ты не робот

Rails i18n - Как обрабатывать случай передачи даты nil, т.е. l (nil)

Я работаю с большим количеством устаревших данных, и иногда поле datetime равно nil/null. Это нарушает локализацию. Есть ли рекомендуемый способ устранения этого, помимо этого:

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

Ответ 1

К сожалению, нет встроенного решения. См. post.

Вы можете определить свой собственный помощник, который поставляет "нулевое" удобочитаемое значение. Например:

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

Ответ 2

Я думаю, что есть более чистый способ исправить это. Я обезглавил I18n в инициализаторе под названием relaxed_i18n.rb

Это содержимое этого файла:

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

Ответ 3

Чтобы продлить ответ Ларри К.,

Помощник должен включать хеш для передачи параметров I18n.

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

Это позволяет вам передавать такие параметры:

= ldate @term.end_date, format: :short