Wie können Sie eine andere HTTP-Anforderung zu verwenden, machen redirect_to?
-
21-08-2019 - |
Frage
Am Ende einer meiner Controller-Aktionen muß ich auf eine Seite umgeleitet, die nur PUT-Anfragen akzeptiert. Ich habe versucht, herauszufinden, wie redirect_to zu bekommen eine Put-Anfrage zu verwenden, aber ohne Erfolg.
Ist das möglich? Oder gibt es eine andere Möglichkeit, dies zu erreichen?
Lösung 3
Ok, so fand ich eine Lösung für mein Problem. Ich fand eine sehr gute aufzuschreiben auf die Situation hier . Meine Implementierung sieht wie folgt aus:
private
def redirect_post(redirect_post_params)
controller_name = redirect_post_params[:controller]
controller = "#{controller_name.camelize}Controller".constantize
# Throw out existing params and merge the stored ones
request.parameters.reject! { true }
request.parameters.merge!(redirect_post_params)
controller.process(request, response)
if response.redirected_to
@performed_redirect = true
else
@performed_render = true
end
end
Dann rief ich diese Methode wie folgt aus:
redirect_post :controller => 'registrations', :action => 'order', :_method => 'put', :authenticity_token => params[:authenticity_token]
So konnte ich ‚fake‘ Put-Anforderung durch einen Post-Anforderung machen (mit redirect_post
) und dann der Zuordnung ‚setzen‘, einen _method
param. Wenn Sie an einem normalen put
Anfrage schauen alle ist es ein post
aus einem Formular mit einem _method
param. So ist es ein wenig hackish aber es wird die Arbeit erledigt.
Außerdem müssen Sie sicherstellen, dass, wenn Sie redirect_post
die Werte Ihrer Hash nennen Strings sind sonst Fehler geworfen werden.
Andere Tipps
Ich glaube nicht, Sie sind in der Lage, dies zu tun, und ich vermute, dass die Begrenzung Teil von HTTP selbst.
Bei der Verwendung von redirect_to -. Die Umleitung geschieht als "302 Moved" Header, wenn nicht anders in den Parametern angegeben
einen Blick auf dem HTTP-Spec Nachdem sie offenbart keine Möglichkeit, die Art der Anforderung zu ändern, der Browser über Umleitung macht.
Diese Klasse von Statuscode angibt dass weitere Maßnahmen getroffen werden durch den User-Agent zu erfüllen, um die Anfrage. Die Aktion erforderlich MAY werden durch den User-Agent durchgeführt ohne Wechselwirkung mit dem Benutzer, wenn und nur dann, wenn das Verfahren in dem verwendeten zweite Anforderung ist GET oder HEAD.
Ich glaube, Sie müssen JavaScript verwenden, um diese Funktionalität zu erreichen, oder vielleicht den Ablauf der Steuerung in Ihrer Anwendung überdenken.
Wenn die Aktion in der gleichen Controller wie, wo Sie versuchen, von umleiten, einfach die Aktion aufrufen und die Vorlage machen etwa so:
def show
index
render :action => "index"
end
Wenn es nicht ist, dann weiß ich nicht, wie Sie das tun.
Sie können auf eine andere Seite umgeleitet, die die Put-Anforderung von dem Client ausstellt, mit Javascript .