【问题标题】:Rails (ruby) create empty array when no association found找不到关联时,Rails(ruby)创建空数组
【发布时间】:2012-05-22 17:53:01
【问题描述】:

所以我有这段代码:

= f.input :aspectRatioId, :label => 'Aspect Ratio', 
:input_html => { :id => 'dvd_aspectRatio_tokens', :data => { :load => [@dvd.aspectRatio] } }

当在关联中找不到任何内容时,我想创建一个空数组。现在,当没有找到任何东西时,它会返回 [null],这会导致需要 [] 的 tokeninoput javascript 出错

我可以通过创建另一个这样的方法来做到这一点:

def self.series_without_empty_values(dvd)
  series = [dvd.dvd_series]
  if series[0].nil?
    series = []
  end
  return series
end

但我宁愿在表单上的:load => 调用中执行此操作。这甚至可能吗?

【问题讨论】:

  • 你可以试试:load => [@dvd.aspectRatio] || []。不确定这是否可行。
  • @HunterMcMillen:不,这行不通,[nil] 是真的,甚至 [] 在 Ruby 中也是真的。 @kaukebie,写那个条件的方式很奇怪:-)即使Ruby没有Array#compact,你也可以简单地写:dvd.dvd_series ? [dvd.dvd_series] : []
  • 几乎没有必要对将要定义或未定义的对象调用.nil?。为简单起见,请改用 if (!series[0])unless (series[0])。但是,如答案中所述,compact 是解决此问题的方法。
  • @HunterMcMillen 那行不通,我试过了。 @tokland:ol' 三元运算符,我喜欢它,但它不起作用,因为 dvd.dvd_series 不会导致 false 除非我做类似我在那里所做的事情:series[0].nil? 其他任何东西都不会返回空数组。
  • @tadman:我实际上认为if series[0].nil?(!series[0]) 更具可读性。我总是想念那些! :) 感谢所有的建议,这就是这个网站的全部内容。

标签: ruby arrays activerecord ruby-on-rails-3.1 simple-form


【解决方案1】:

使用Array.compact 删除数组中的nil 值:

[ "a", nil, "b", nil, "c", nil ].compact
=> [ "a", "b", "c" ]

[nil].compact
=> []

【讨论】:

  • 好主意,也许将它与“empty?”结合起来:“if series.compact.empty?”
  • 这太棒了!我不知道这种方法。现在我可以删除所有这些额外的方法!不得不添加丑陋的黑客真的很困扰我。非常感谢。 (我喜欢 Ruby :)
  • 查看Enumerable 库,因为它充满了有趣的功能。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
相关资源
最近更新 更多