Как мне найти и заменить 'nil' значения хэша Ruby на 'None' или 0? - PullRequest
3 голосов
/ 04 октября 2019

Я пытаюсь перейти к каждому значению в итерации вложенного хэша массива и заменить все значения nil на что-то вроде 'None' или 0. Пожалуйста, посмотрите мой код, который явно не работает. Мне нужно исправить это, прежде чем я передам его в Мои представления в Rails для итерации и рендеринга:

Мой контроллер:

def show
  results = Record.get_record(params[:trans_uuid])
  if !results.empty?
    record = results.map { |res| res.attributes.symbolize_keys }
    @record = Record.replace_nil(record) # this calls method in Model
  else
    flash[:error] = 'No record found'
  end
end

Моя модель:

def self.replace_nil(record)
  record.each do |r|
    r.values == nil ? "None" : r.values
  end
end

record выглядит так, когда передается методу Model self.replace_nil(record:

[{:id=>1, :time_inserted=>Wed, 03 Apr 2019 15:41:06 UTC +00:00, :time_modified=>nil, :request_state=>"NY", :trans_uuid=>"fe27813c-561c-11e9-9284-0282b642e944", :sent_to_state=>-1, :completed=>-1, :record_found=>-1, :retry_flag=>-1, :chargeable=>-1, :note=>"", :bridge_resultcode=>"xxxx", :bridge_charges=>-1}]

1 Ответ

7 голосов
/ 04 октября 2019

each не "сохранит" значение, которое вы получаете в блоке. Вместо этого попробуйте map.

def self.replace_nil(record) 
  record.map do |r| 
    r.values.nil? ? "None" : r.values
  end 
end

На самом деле, есть способ для этого;transform_values:

record.transform_values do |value|
   value.nil? ? 'None' : value
end

Я понял, что с помощью Rails вы можете использовать только presence и оператор or:

record.transform_values do |value|
  value.presence || 'None'
end
...