Schienenparameter erklärt?

228

Könnte jemand paramsin Rails Controller erklären : Woher sie kommen und worauf sie sich beziehen?

  def create
    @vote = Vote.new(params[:vote])
    item = params[:vote][:item_id]
    uid = params[:vote][:user_id]
    @extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])
    last_vote_time = @extant.created_at unless @extant.blank?
    curr_time = Time.now
  end

Ich möchte diesen Code Zeile für Zeile lesen und verstehen können, was los ist.

Dru
quelle
2
Was ist Ihr Hintergrund zur serverseitigen Webentwicklung? Welche Technologien kennen Sie bereits?
Maurício Linhares
3
Ich bin seit Jahren mit HTML und CSS beschäftigt. Besuchte Klassen, die PHP, JS und Java verwendeten. Ich habe allerdings sehr wenig MVC mit PHP verwendet. Ich habe das Programmieren mit Java wirklich gelernt. Und ich verstehe die Datenbanktheorie sehr gut.
Dru

Antworten:

281

Die Parameter stammen aus dem Browser des Benutzers, wenn er die Seite anfordert. Bei einer HTTP-GET-Anforderung, die am häufigsten vorkommt, werden die Parameter in der URL codiert. Zum Beispiel, wenn der Browser eines Benutzers dies anfordert

http://www.example.com/?foo=1&boo=octopus

dann params[:foo]wäre "1" und params[:boo]wäre "Krake".

In HTTP / HTML sind die Parameter eigentlich nur eine Reihe von Schlüssel-Wert-Paaren, bei denen der Schlüssel und der Wert Zeichenfolgen sind. Ruby on Rails hat jedoch eine spezielle Syntax, um die Parameter zu einem Hash mit darin enthaltenen Hashes zu machen. Zum Beispiel, wenn der Browser des Benutzers dies anfordert

http://www.example.com/?vote[item_id‹=1&vote[user_id‹=2

dann params[:vote]wäre ein Hash, params[:vote][:item_id]wäre "1" und params[:vote][:user_id]wäre "2".

Die Ruby on Rails-Parameter entsprechen dem Array $ _REQUEST in PHP .

David Grayson
quelle
13
Entspricht $ _REQUEST, außer dass $ _REQUEST Get-, Post- und Cookie-Daten enthält, während Parameter nur Daten abrufen und veröffentlichen.
Parziphal
3
@renocor POST-Daten sind ebenfalls im Rails- paramsHash enthalten. Cookie-Daten sind im sessionHash enthalten.
Richard Jones
Diese Antwort lässt eine andere Quelle von Parametern aus: die URL. Weitere Informationen finden Sie in der Antwort von Hammar.
Richard Jones
1
toasterlovin, es hört sich so an, als hätten Sie den zweiten Satz meiner Antwort nicht gelesen oder sich das erste Beispiel angesehen.
David Grayson
1
@AnkitDhingra ... Ich denke, es wird immer eine Zeichenfolge sein, da HTTP-Parameter wirklich nur Schlüssel / Wert-Paare sind und Rails (höchstwahrscheinlich Rack Gem) diese nach Schlüsselwert in Hashes und Arrays analysieren, aber ich habe nichts dergleichen gesehen Dies teilt Rails mit, dass der Wert eine Zahl ist.
Rubyprince
75

Wie andere bereits betont haben, können paramsWerte aus der Abfragezeichenfolge einer GET-Anforderung oder den Formulardaten einer POST-Anforderung stammen, aber es gibt auch einen dritten Ort, von dem sie stammen können: den Pfad der URL.

Wie Sie vielleicht wissen, verwendet Rails sogenannte Routen, um Anforderungen an die entsprechenden Controller-Aktionen weiterzuleiten. Diese Routen können Segmente enthalten, die aus der URL extrahiert und in diese eingefügt werden params. Wenn Sie beispielsweise eine Route wie diese haben:

match 'products/:id', ...

Dann wird eine Anfrage an eine URL wie http://example.com/products/42gesetzt params[:id]zu 42.

Hammar
quelle
Wie bekommt man einen zweiten Parameter? wie / Squad / ID / Mitglied / ID / Zeug
Weteamsteve
48

Params enthält die folgenden drei Gruppen von Parametern:

  1. Vom Benutzer angegebene Parameter
    • GET (http://domain.com/url?param1=value1¶m2=value2 setzt params [: param1] und params [: param2])
    • POST (zB JSON, XML wird automatisch analysiert und in Parametern gespeichert)
    • Hinweis: Standardmäßig dupliziert Rails die vom Benutzer angegebenen Parameter und speichert sie in params [: user], wenn sie in UsersController mit der Einstellung wrap_parameters geändert werden können
  2. Routing-Parameter
    • match '/user/:id' in route.rb setzt params [: id]
  3. Standardparameter
    • params[:controller]und params[:action]ist immer verfügbar und enthält den aktuellen Controller und die aktuelle Aktion
thejaz
quelle
1
Könnten Sie Ihre Notiz unter User supplied parametersetwas mehr erweitern? Ein Beispiel für den Parameter-Hash im UsersController wäre beispielsweise hilfreich. In Ihrem Beispiel klingt es so, als würde der Hash ungefähr so ​​aussehen: {first_name: "mike", user: {first_name: "mike"} ...} Ist das richtig?
7stud
1
Ich sehe das nicht in Rails4. Zum Beispiel {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "action"=>"update", "controller"=>"apples", "id"=>"4"}. Vergib mir, wenn ich falsch liege, ich bin ein Rails-Anfänger. Laut Ihrer Notiz sollte ich sehen: {"_method"=>"put", "authenticity_token"=>"gubHya6uQrQLjPRXhOC0RUuCRdn7NFr6CeKrbRfBSHI=", "ripe"=>"true", "apple" => {"ripe"=>"true"}, "action"=>"update", "controller"=>"apples", "id"=>"4"} Ich weiß nicht, ob das mit starken Parametern in Rails4 zu tun hat oder nicht.
7stud
2
Ich sehe die duplizierten Parameter in Rails 4, aber nur unter json POST-Anforderungen (unter Verwendung von Angularjs), nicht unter Rails eigenen HTML-Posts. Dieser Link erklärt warum: stackoverflow.com/questions/10774972/…
Homan
13

Grundsätzlich sind Parameter benutzerdefinierte Daten für die Schienenanwendung.

Wenn Sie ein Formular veröffentlichen, erfolgt dies im Allgemeinen mit einer POST-Anforderung im Gegensatz zur GET-Anforderung. Sie können normale Rails-Anforderungen als GET-Anforderungen betrachten, wenn Sie die Site durchsuchen, wenn dies hilfreich ist.

Wenn Sie ein Formular senden, wird das Steuerelement an die Anwendung zurückgegeben. Wie erhalten Sie die Werte, die Sie an das Formular gesendet haben? paramsich zeige.

Über Ihren Code. @vote = Vote.new params[:vote]Erstellt eine neue Abstimmung zur Datenbank unter Verwendung der Daten von Parametern [: Abstimmung]. Wenn Ihr übermittelter Formularbenutzer unter dem Namen "Vote" benannt wurde, befinden sich alle Daten in diesem Feld: Vote des Hashs.

Die nächsten beiden Zeilen werden verwendet, um das Element abzurufen, und der Benutzer der UID hat das Formular gesendet.

@extant = Vote.find(:last, :conditions => ["item_id = ? AND user_id = ?", item, uid])

findet die neueste oder zuletzt eingefügte Abstimmung aus der Datenbank mit den Bedingungen item_id = item und user_id = uid.

Die nächsten Zeilen benötigen die letzte Abstimmungszeit und die aktuelle Zeit.

Smar
quelle
6

Auf der Rails-Seite paramsbefindet sich eine Methode, die ein ActionController::ParametersObjekt zurückgibt . Siehe https://stackoverflow.com/a/44070358/5462485

Margotte
quelle
3
+1 zur Verdeutlichung, dass dies paramseine Methode ist. Ruby kann es schwierig machen, Variablen von Methoden zu unterscheiden
Samrap