2016-10-25 1 views
2

J'ai une page de vue errors/401. Ceci est dédié à l'affichage des erreurs avec 401 statut, et je veux toujours rendre cette page avec le statut 401. Dans le contrôleur qui rend cette page, je vous écris commeDéfinition de l'état de l'en-tête à partir de la vue

render "error/401", status: 401 

Je pense que c'est redondant. Comme cette page est toujours rendue avec un statut particulier, je veux spécifier l'état dans la page de vue, ne pas le mentionner dans le contrôleur, et obtenir le même résultat. Je veux juste écrire:

render "error/401" 

Est-ce possible?

+1

je ne suis pas sûr que ce soit possible, mais depuis vous utilisez controller/view pour retourner une page d'erreur personnalisée. Le contrôleur rails ajoute toujours 'status: 200' à votre en-tête de réponse sauf si vous mentionnez autrement – sa77

+0

Non, car votre serveur traite la requête/réponse - laquelle dans ce cas est le contrôleur. Le contrôleur est supposé prendre soin de votre réponse et des en-têtes de demande de réponse qui inclut le statut. Vous n'êtes pas supposé le faire dans vos opinions. Cela étant dit, vous pouvez créer ce fichier en tant que public/401.html, et pendant que vous dites simplement que le serveur Web 'status: 401' servira public/401.html. Cependant, ce 401.html sera un fichier HTML statique et ne sera pas capable d'analyser n'importe quel code ruby ​​à l'intérieur. – Surya

Répondre

2

Je veux préciser le statut dans la page de vue, sans le mentionner dans le contrôleur

Il ne fait pas partie de votre point de vue. Un modèle doit générer des caractères, pas des codes d'état HTTP.

Je pense que c'est redondant.

C'est. Rails utilise des exceptions pour signaler et gérer de telles erreurs, par ex. un enregistrement manquant entraîne une exception ActiveRecord::RecordNotFound qui à son tour rend une page 404.

Vous pouvez faire la même chose en définissant une erreur NotAuthorised qui est remis par rescue_from dans votre ApplicationController:

class ApplicationController < ActionController::Base 
    class NotAuthorised < StandardError; end 

    rescue_from NotAuthorised do |exception| 
    render 'error/401', status: 401 
    end 
end 

D'un autre contrôleur:

class FooController < ApplicationController 
    def index 
    raise NotAuthorised 
    end 
end