2016-04-26 15 views
1

我将返回一个错误或用户的方法,依赖于用户的状态,这样重写多个直列返回

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

+2

的首要条件,思考,总是支持是假的,因为find_by提高时发现,但记录 –

+1

你也可以使用一个例外[加载ActiveModel串行器(HTTPS:/ /github.com/rails-api/active_model_serializers)来指定将哪个'user'字段渲染为JSON,这样就不必在控制器中指定它们。 –

+0

如果找不到记录,'find_by'不会引发异常。它将是零。所以,如果我使用'find_by!',所有好@МалъСкрылевъ – ksarunas

回答

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的一个例子。

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 

当然,你可以有一个主持人以后将所有的逻辑移到控制器之外,只是想法。

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