Ruby两个if块-使用保护子句

时间:2020-04-14 08:11:19

标签: ruby-on-rails ruby

我正在使用jira-ruby gem通过我的应用创建一次jira问题。应在一个或两个板上创建Jira板上的票证,具体取决于之前触发的操作。例如,当新成员添加到仓库中时,应在两个单独的面板(支持和安全)中创建两个票证。我必须两次使用client.Issue.build(这是一个gem方法),因此我需要执行以下操作:

      def call
        if SUPPORTBOARD_WEBHOOKS_CLASSES.include?(webhook.action_type_class)
          issue = client.Issue.build
          issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}})
        end

        if SECURIY_WEBHOOKS_CLASSES.include?(webhook.action_type_class)
          issue = client.Issue.build
          issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}})
        end
      end

但是我收到来自rubocop的错误消息:use a guard clause

2 个答案:

答案 0 :(得分:2)

尝试这种方式

def call
  if SUPPORTBOARD_WEBHOOKS_CLASSES.include?(webhook.action_type_class)
    issue = client.Issue.build
    issue.save(issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}}))
  end

  return unless SECURIY_WEBHOOKS_CLASSES.include?(webhook.action_type_class)

  issue = client.Issue.build
  issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}})
end

答案 1 :(得分:1)

我认为 rubocop 规则试图阻止方法顶部的大型 if/else 逻辑。该规则有助于限制方法内部的缩进量。

在我看来,您的两个“if”块中的代码块是相同的。假设 SUPPORTBOARD_WEBHOOKS_CLASSES 和 SECURIY_WEBHOOKS_CLASSES 是数组,您可以这样做:

  def call
    if (SUPPORTBOARD_WEBHOOKS_CLASSES | SECURIY_WEBHOOKS_CLASSES).include?(webhook.action_type_class)
      issue = client.Issue.build
      issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}})
    end
  end

或者如果你真的想使用保护条款规则:

  def call
    return unless (SUPPORTBOARD_WEBHOOKS_CLASSES | SECURIY_WEBHOOKS_CLASSES).include?(webhook.action_type_class)
    
    issue = client.Issue.build
    issue.save({"fields"=>{"summary"=>"example.rb","project"=>{"id"=>"10001"},"issuetype"=>{"id"=>"3"}}})
  end