如何找到并用“ None”或0替换Ruby哈希的“ nil”值?

Dem*_*ims 3 ruby hash null ruby-on-rails

我正在尝试在嵌套嵌套数组的迭代中向下钻取每个值,并用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
Run Code Online (Sandbox Code Playgroud)

我的模特:

def self.replace_nil(record)
  record.each do |r|
    r.values == nil ? "None" : r.values
  end
end
Run Code Online (Sandbox Code Playgroud)

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}]
Run Code Online (Sandbox Code Playgroud)

Seb*_*lma 7

each不会“坚持”您在代码块中产生的值。试试吧map

def self.replace_nil(record) 
  record.map do |r| 
    r.values.nil? ? "None" : r.values
  end 
end
Run Code Online (Sandbox Code Playgroud)

实际上,有一种方法可以解决此问题。transform_values

record.transform_values do |value|
   value.nil? ? 'None' : value
end
Run Code Online (Sandbox Code Playgroud)

我意识到使用Rails可以使用just presenceoroperator:

record.transform_values do |value|
  value.presence || 'None'
end
Run Code Online (Sandbox Code Playgroud)