重写多个内联返回

时间:2016-04-26 09:29:33

标签: ruby-on-rails ruby

我有一个会返回错误或用户的方法,取决于用户的状态,比如

  def authenticate
    user = User.find_by(email: params[:mail].downcase)
    return render json: Errors::EMAIL_NOT_EXISTS, status: 404 if user.nil?
    return render json: Errors::WRONG_EMAIL_PASSWORD_COMBINATION, status: 403 unless user.valid_password?(params[:password])
    return render json: Errors::EMAIL_NOT_VERIFIED, status: 202 if 'active' != user.activation_state
    render json: user, only: %w(access_token first_name last_name), status: 201
  end

我正在失眠,因为我觉得它太难看了,应该有更好的方法来处理多种回归的可能性,但是我看不到它。
如何在不使用多个返回或多个ifs

的情况下使其更易读

3 个答案:

答案 0 :(得分:3)

我认为你可以做到这一点

status, error_details = case
  when user.nil?
    [404, Errors::EMAIL_NOT_EXISTS]
  when !user.valid_password?(params[:password])
    [403, Errors::EMAIL_NOT_EXISTS]
  when 'active' != user.activation_state
    [202, Errors::EMAIL_NOT_VERIFIED]
  else
    [201, nil]
end

return render json: user, only: %w(access_token first_name last_name), status: status if error_details.blank?

render json: error_details, status: status

答案 1 :(得分:1)

这里有条件的情况怎么样?

case
when user.nil?
  render json: Errors::EMAIL_NOT_EXISTS, status: 404
when !user.valid_password?(params[:password])
  render json: Errors::WRONG_EMAIL_PASSWORD_COMBINATION, status: 403
when 'active' != user.activation_state
  render json: Errors::EMAIL_NOT_VERIFIED, status: 202
else
  render json: user, only: %w(access_token first_name last_name), status: 201
end

当然,您可以让演示者稍后将所有逻辑移出控制器,只是想法。

答案 2 :(得分:1)

我喜欢上面的案例建议,但使用if并没有错。但是,如果您不使用if的单行格式,if方法会更清晰。此外,返回关键字不是必需的,因为在Ruby中,您可以将if表达式的结果赋给变量,或者只是让它成为方法的返回值,因为它是最后一个计算的表达式。你可以像这样编码:

def authenticate

  user = User.find_by(email: params[:mail].downcase)

  stuff = if user.nil?
    { json: Errors::EMAIL_NOT_EXISTS, status: 404 }
  else unless user.valid_password?(params[:password])
    { json: Errors::WRONG_EMAIL_PASSWORD_COMBINATION, status: 403 }
  else if 'active' != user.activation_state
    { json: Errors::EMAIL_NOT_VERIFIED, status: 202 }
  else
    { json: user, only: %w(access_token first_name last_name), status: 201 }
  end

  render stuff
end

使用if表达式的结果作为方法的返回值的示例位于https://gist.github.com/keithrbennett/6876886030c7d6cf80d1b6fbcfebf7ae