0

Dans mon contrôleur de rails, je dois vérifier après avoir obtenu @group avec before_action que ce groupe n'est pas système.Refactoring rendu multiple dans le contrôleur

Mais j'ai beaucoup de répétition dans mon contrôleur. J'ai essayé de se transformer en une méthode distincte mais je reçois le classique:

Render and/or redirect were called multiple times in this action. Please note that you may only call render OR redirect, and at most once per action. Also note that neither redirect nor render terminate execution of the action, so if you want to exit an action after redirecting, you need to do something like "redirect_to(...) and return". 

Voici une partie de mon code sans la méthode séparée qui me donne l'erreur.

def destroy 
    if @group.is_system? 
    render json: { errors: 'You can\'t delete a group system' }, status: 403 
    return 
    end 

    ... 
end 

def update 
    if params[:group] && !params[:group].empty? 
    if @group.is_system? 
     render json: { errors: 'You can\'t edit a group system' }, status: 403 
     return 
    end 

    ... 

    else 
    render json: { errors: 'Missing correct parameters' }, status: :unprocessable_entity 
    end 
end 

..... 
+1

Veuillez ajouter la partie 'callback ('before_action')', pas très claire de ce que vous faites. – cqcn1991

+1

Je confirme que vous devriez ajouter le 'before_action' que vous avez utilisé puisque je ne vois pas pourquoi vous auriez le message d'erreur:' Render et/ou rediriger ont été appelés plusieurs fois dans cette action. Veuillez noter que vous ne pouvez appeler que render OU rediriger, et au plus une fois par action. Notez également que ni rediriger ni rendre terminer l'exécution de l'action, donc si vous voulez quitter une action après la redirection, vous devez faire quelque chose comme "redirect_to (...) et retour" ' – apneadiving

+0

mon before_action seulement trouver commencer @ group = current_store.groups.find (params [: group_id]) sauvetage ActiveRecord :: RecordNotFound render_404 return fin – Mio

Répondre

1

Vous pourriez avoir dans un contrôleur parent:

def render_errors(errors, status) 
    render json: { errors: Array(errors) }, status: status 
end 

def render_403(errors) 
    render_errors(errors, 403) 
end 

def render_422(errors) 
    render_errors(errors, 422) 
end 

puis dans votre action:

before_action :check_system 

def check_system  
    # I assume you already defined @group 
    render_403('You can\'t delete a group system') if @group.is_system? 
end 

Avis J'ai changé un peu de votre code: avoir errors clé qui est seulement chaîne est très trompeuse, devrait être un tableau.

+0

Merci pour votre réponse apneadiving. Je vais essayer. – Mio

+0

Travaillez comme un charme. Merci pour les conseils pour les erreurs – Mio