如何在可枚举对象的Ruby / Rails中将nil和“空字符串”替换为“ None”?

时间:2019-10-08 17:32:07

标签: ruby-on-rails ruby activerecord hash enums

我要使用Rails中的对象:一个Record :: ActiveRecord_Relation和一个ActionController :: Parameters,并将它们转换为可用的哈希,以在视图中呈现。我需要将nil和“”替换为“ none”。我可以采用非干燥的方式来实现,并通过以下方式保护哈希的每个键/值对:

  <div><%= @records_incoming[:time_inserted] || @records_incoming[:time_inserted].empty? ? "none" : @records_incoming[:time_inserted]  %></div>

,但是看起来好像不是Ruby一样(当然,我是新开发人员)。

我试图像这样在控制器中处理此问题:


def show
    sent_results = Record.get_sent(params[:request][:trans_uuid]) 

    if !sent_results.empty? 

      incoming_request = params[:request].permit!
      @records_sent = sent_results[0].attributes.each { |k,v| v.class == String && v.empty? || !v ? sent_results[0].attributes[k] = "none" : sent_results[0].attributes[k] } 
      @records_incoming = incoming_request.to_h.map { |k, v| v.empty? || !v ? "none" : v }
      byebug 
    else    
      flash[:error] = 'No record found'
    end 
  end

,但这不会将nil和空字符串值更改为'none'。如果使用map,我当然会得到一个数组作为返回值,但是我需要保留一个Hash。

请总体上建议任何更好的Rails方法。尝试将2个散列放入视图中以进行拆分和渲染。

2 个答案:

答案 0 :(得分:2)

您可以尝试使用presence

<%= @records_incoming[:time_inserted].presence || "none" %>

它处理您需要的两种情况,@records_incoming[:time_inserted]为nil或空字符串,因为它是present?时返回接收者。

答案 1 :(得分:0)

您可以在参数哈希上使用transform_values!

尝试

incoming_request.transform_values! { |k, v| v.empty? || !v ? "none" : v }
@records_incoming = incoming_request

参考:https://apidock.com/rails/Hash/transform_values%21

注意:transform_values!将哈希值原位更新