2017-09-25 3 views
1

Imaginons J'ai une classesortie Ruby On Rails méthode du contrôleur d'aide

class Test < ActiveRecord::Base 
    include AuthenticatorHelper 

    def test 
    authenticate_or_fail! 
    puts "If I fail, this should be unreachable" 
    end 
end 

et

module AuthenticationHelper 
    def authenticate_or_fail! 
    @user = User.find(params[:token]) 
    unless @user 
     render :json => {code: 401, :err => 'Unauthorized'} and return 
    end 
    end 
end 

Ce que je veux faire est soit authentifie ou répondre avec un JSON msg. Cependant, il sera évidemment ignorer ma déclaration de retour en raison de l'imbrication et il sera toujours imprimer mon message

Si j'échoue, cela devrait être injoignable

Répondre

1

En ce qui concerne la question

Vous pourriez extraire l'appel dans un before_filter/before_action (basé sur la version rails).

class Test < ActiveRecord::Base 
    include AuthenticatorHelper 

    before_action :authenticate_or_fail! 

    def test 
    puts "If I fail, this should be unreachable" 
    end 
end 

Veuillez consulter the documentation pour plus de détails. Parce que votre méthode d'aide rend en cas de panne, les rails empêcheront l'appel de la méthode test. Vous n'aurez pas besoin de la partie and return alors, qui ne serait que de retour de la méthode de toute façon et en tant que tel était un NoOp.

En dehors de la question, mais aussi à noter:

Je ne veux pas signaler des erreurs dans l'intérêt de celui-ci. Je veux juste empêcher l'OP de tomber sur une série de bugs plus tard.

User.find(params[:token]) 

Lève une exception si aucun enregistrement n'est trouvé. A cause de cela, la partie unless @user ne sera pas évaluée en cas de jeton invalide. Vous pouvez utiliser

User.find_by(id: params[:token]) 

à la place.

Votre classe qui ressemble à un contrôleur est nommée Test et hérite de ActiveRecord::Base. Le premier est inhabituel car TestsController serait plus le long des lignes de rails et les secondes semble tout à fait fausse. Un contrôleur doit hériter de ApplicationController (qui se hérite de ActionController::Base)

+0

'ActiveRecord :: base' n'a pas un' before_action' – Stefan

+0

C'est @Stefan correct, c'est pourquoi je conseillai d'hériter de 'ApplicationController' au lieu . J'ai été mis en piste par 'ActiveRecord :: Base' aussi, mais l'utiliser dans le contexte affiché doit clairement être une erreur, donc j'ai simplement supposé qu'il devait être corrigé comme décrit. – ulferts