Geben Sie einen bestimmten http-Statuscode in Rails zurück

Antworten:

81

Für die gesamte Anwendung:

# ApplicationController
before_filter :return_unavailable_status

private
  def return_unavailable_status
    render :nothing => true, :status => :service_unavailable
  end

Wenn Sie eine benutzerdefinierte Fehlerseite wünschen, können Sie Folgendes tun:

render 'custom_unavailable_page', :status => :service_unavailable    

Wenn Sie es nicht für bestimmte Controller möchten:

# SomeController
skip_before_filter :return_unavailable_status
Ich wurde ausgeraubt
quelle
Um eine benutzerdefinierte Downpage anzuzeigen, werde ich render "custom_unavailable_page"anstelle vonrender :nothing => true
Sathish Manohar
1
@SathishManohar Genau. custom_unavailable_pagewäre der Name der Ansichtsdatei, die Sie rendern würden.
Ich wurde am
1
Wo ist das dokumentiert? Was sind die anderen Status? api.rubyonrails.org/classes/ActionView/Helpers/…
Chloe
3
@Chloe Ich glaube nicht, dass es sehr gut dokumentiert ist, aber hier ist eine Liste apidock.com/rails/ActionController/Base/…
iwasrobbed
1
DEPRECATION WARNING: Die :nothingOption ist veraltet und wird in Rails 5.1 entfernt. Verwenden Sie headMethode, um mit leerem Antwortkörper zu antworten
juliangonzalez
100

Sie können verwenden head

head 503
# or
head :service_unavailable
Sergio Tulentsev
quelle
11
Ich kann Statussymbole verwenden wie: service_unavailable Alle Status: apidock.com/rails/ActionController/Base/…
freemanoid
1
@freemanoid: Ich persönlich mag Integer-Codes besser. Ich kenne sie schon. Sie müssen sich keine weiteren Werte merken.
Sergio Tulentsev
3
DEPRECATION WARNING: Die :nothingOption ist veraltet und wird in Rails 5.1 entfernt. Verwenden Sie headMethode, um mit leerem Antwortkörper zu antworten
juliangonzalez
1
@SergioTulentsev Ich würde nur die Antwort aktualisieren, um sie zu verwenden, headund wenn Sie die ursprüngliche Antwort für die Nachwelt behalten möchten, geben Sie sie einfach unten als "ursprüngliche Antwort" oder so ein. Ich denke, wir können uns alle einig sein, dass dies headder richtige Weg ist, zumal dies render nothing: truebei aktuellen Rails-Versionen veraltet ist.
Joshua Pinter
1
@ JoshuaPinter: in der Tat. was habe ich gedacht
Sergio Tulentsev
1

Folgendes funktioniert für mich:

format.any { render :json => {:response => 'Unable to authenticate' },:status => 401  }

Die :responsefür die HTML-Antwort, nur für den Fall, dass über den Browser darauf zugegriffen wird.

Der Renderkopf 503 scheint mit der obigen Anweisung nicht zu arbeiten.

Frank Gracias
quelle
1
Das wäre schlecht für SEO. Zum Beispiel würde Google dies als eine fehlerhafte Website betrachten, nicht nur als eine Website, die vorübergehend nicht verfügbar ist, sondern voraussichtlich wieder verfügbar sein wird. Siehe dies: yoast.com/http-503-site-maintenance-seo
Labyrinth
Es könnte sich lohnen, dies in "Service nicht verfügbar" / 503 zu ändern, damit es dem Zweck der Frage entspricht. Ich nehme an, es ist die "Render Head" -Syntax, die für Sie nicht funktioniert, und nicht der Fehlercode.
mwfearnley