我有一个会返回错误或用户的方法,取决于用户的状态,比如
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
答案 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。