Rails: Abfrageparameter vs Postparameter

8

Angenommen, Sie haben eine URL

%Vor%

und in der Anfrage haben Sie auch einen Post-Parameter

%Vor%

Was würde

?

params[:a] in diesem Fall? hängt es vom HTTP-Verb ab?

Wenn es vom HTTP-Verb abhängt,

Was ist, wenn Ihr Formular aussieht wie

? %Vor%

Was wäre params[:a] in diesem Fall?

AKTUALISIEREN

Also habe ich nur ein kleines Experiment gemacht und den Chrome Debugger benutzt, um ?authenticity_token=abc an die Action-URL anzuhängen. Ich schaute auf das Serverprotokoll und ich sah, dass Parameter authenticity_token => 'abc' hat. Ich glaube auch, dass die Methode in diesem Fall POST ist.

Lass mich wissen, was ihr euch ausgedacht habt.

    
denniss 14.12.2011, 19:08
quelle

4 Antworten

19

Wenn ich dies in einem Beispielcode versuchte, konnte ich sehen, dass die Abfrageparameter (GET) Vorrang vor dem POST-Text hatten. Also ging ich in den Code von Rack , der die HTTP-Anfragen in Rails behandelt. Hier ist der Code von request.rb

%Vor%

Hier die Methode

  • GET - gibt die Abfrageparameter in einem Hash-Format
  • zurück
  • POST - gibt den Post-Body in einem Hash-Format
  • zurück

Entsprechend dem Code für params sollten die GET-Parameter bei identischen Schlüsseln durch POST-Parameter überschrieben werden. (%Code%). Aber das ist im Gegensatz zu dem, was ich bekam, als ich es praktisch versuchte.

Die einzige Möglichkeit ist, dass dieser Code von Rails überschrieben wird. Als ich darüber nachdachte, machte es Sinn, da der self.GET.merge(self.POST) Hash von den Rails immer params und "controller" Schlüssel enthält, die im Falle von Rack nicht vorhanden sind. Also habe ich mir auch den Code von Rails angeschaut und festgestellt, dass die "action" -Methode tatsächlich außer Kraft gesetzt wurde. Werfen Sie einen Blick auf request.rb und parameters.rb im Rails-Quellcode. In parameter.rb haben wir:

%Vor%

und in request.rb :

%Vor%

Also, hier

  • query_parameters - Alias ​​für die GET-Methode
  • request_parameters - Alias ​​für die POST-Methode
  • path_parameters - Methode, die den Controller und die Aktion für die Anfrage als Hash zurückgibt
  • Parameter - Alias ​​für params (Es wurde hier außer Kraft gesetzt) ​​

Beachten Sie, dass die GET-Methode und die POST-Methode ebenfalls außer Kraft gesetzt wurden, hauptsächlich um den Hash zu konvertieren, der an ein Objekt von HashWithIndifferentAccess zurückgegeben wurde.

Betrachtet man also den Code hier ( params ), wird deutlich, dass POST-Parameter bei identischen Schlüsseln in Rails durch GET-Parameter überschrieben werden. Oder anders ausgedrückt: GET-Parameter haben Vorrang vor POST-Parametern.

    
rubyprince 14.12.2011, 21:59
quelle
6

Rails verwendet Rack::Request für HTTP-Anfragen. Allerdings wird die Methode Rack params in ActionDispatch::Http::Parameters neu definiert. (über einen Alias).

Diese Methode params , die eine Anfrage zurückgibt Parameter, wird implementiert als:

%Vor%

Beachten Sie die Methode aliased parameters .

Sofern nicht anders definiert, überschreiben Parameter aus der Abfragezeichenfolge Parameter aus dem POST-Hauptteil.

    
toddsundsted 14.12.2011 20:41
quelle
1

Es wäre 2. Aber für das Routing würde es mit der '1' übereinstimmen.

Wenn Sie möchten, können Sie request.GET und request.POST verwenden, um auf die Variablen get und post zuzugreifen.

    
Joe Van Dyk 14.12.2011 19:12
quelle
1

Nein, es hängt nicht von dem HTTP-Verb ab, aber Sie können sicher verschiedene Aktionen haben, um GET und POST zu behandeln, oder es kann dasselbe sein und Sie erhalten in beiden Fällen 'params [: a].

    
Mr_Nizzle 14.12.2011 19:59
quelle