Guard子句而不是将代码包装在条件表达式Rails中

时间:2015-07-01 06:24:08

标签: ruby-on-rails

有以下代码:

# API controller for authentication
class Api::V1::SessionsController < Api::V1::ApplicationController
  skip_before_action :authorize

  def create
    @user = User.find_by(email: params[:user][:email])
    unless @user && @user.authenticate(params[:user][:password])
      @error_message = 'Invalid username or password'
      render 'shared/error', status: :unauthorized
    end
  end
end

我使用Rubocop检查我的代码是否符合Ruby指南。我收到以下错误:

Use a guard clause instead of wrapping the code inside a conditional expression.
    unless @user && @user.authenticate(params[:user][:password])

所以,我不明白如何使用guard子句更好地编写代码。提前谢谢!

2 个答案:

答案 0 :(得分:30)

关注rubocops规范:html binding

像...一样的东西。

public void SomeMethod ()
{
    OtherMethod();
}

public void OtherMethod ([CallerMemberName] string memberName = null)
{
    Console.WriteLine(memberName);
}

答案 1 :(得分:2)

编程中有一条方便的规则,名称为“急切返回”,因此在这种情况下,此Guard clause instead of wrapping the code inside a conditional expression警报的含义是,应该使用急切的return语句而不是包装代码if语句内(if内的代码块或任何其他条件)

所以最好声明一下:

  def method_name
    return unless something?
    # some code logic here
  end

比这...

def method_name
  if something?
    # some code logic here
  end
end

在编码中,我们一直在寻找简单性和原子定义,急切的return语句是收紧代码的一种非常好的方法。