如何在红宝石中正确拯救这种说法?

时间:2017-04-10 22:51:21

标签: ruby chef rubocop

我有一个厨师资源,我只是在烹饪书中添加了带有cookstyle的linting。我在食谱中有这一行:

existing_value = key.to_s.split('.').inject(node.elasticsearch) { |result, attr| result[attr] } rescue nil if existing_value.nil?

这导致了linter错误。我尝试了几件事,但我不确定如何说同样的事并通过皮棉测试。

 Style/RescueModifier: Avoid using rescue in its modifier form

如果我完全删除了救援声明,则会导致此异常:

Chef::Mixin::Template::TemplateError (undefined method `[]' for nil:NilClass) on line #52:
    ...
    52: <%= print_value 'action.destructive_requires_name' -%>        
    ...

2 个答案:

答案 0 :(得分:1)

因此,如果您使用的是近期的Chef版本,我们实际上有一个方法。你可以这样做:

existing_value ||= node.read("elasticsearch.#{key}")  

我们会照顾其余的。

答案 1 :(得分:0)

虽然#coderanger的解决方案更好,但是linter要求你使用长救援表格

begin
  existing_value = key.to_s.split('.').inject(node.elasticsearch) { |result, attr| result[attr] } 
rescue 
  nil
end if existing_value.nil?

或通常认为更好

if existing_value.nil?
  begin
    existing_value = key.to_s.split('.').inject(node.elasticsearch) { |result, attr| result[attr] } 
  rescue 
    nil
  end
end

我还会将rescue更改为更具体的rescue Chef::Mixin::Template::TemplateError,抢救所有异常可能不是您想要的(即您不想隐藏真正的异常)