wie form_for arbeitet in Ruby on Rails
Ich bin ein newbie. Ich habe Lesen der API-Dokumentation. Aber immer noch nicht verstehen, wie form_for funktioniert.
Erstens von Ruby on Rails Tutorial, das Formular für die follow-Taste:
<%= form_for(current_user.relationships.build(followed_id: @user.id)) do |f| %>
<div><%= f.hidden_field :followed_id %></div>
<%= f.submit "Follow", class: "btn btn-large btn-primary" %>
<% end %>
Verstehe ich current_user.relationships.build(followed_id: @user.id)
bedeutet einen neuen Rekord. Aber warum können wir nicht einfach Unterwerfen und trigger-Steuerung, um den Datensatz speichern, ohne hidden_field? Warum müssen wir noch immer auf post followed_id controller?
Zweitens, in hidden_field, was bedeutet :followed_id
bedeutet? Ich glaube, das ist ein symbol, D. H. es entspricht nur "followed_id" nicht eine variable id. Wenn, dass ist nur der name des input Feldes ist, was ist dann Ihr Wert?
Drittens, wie lässt form_for
wissen, wo die Vorlage gesendet werden soll? Die controller und action, die form_for
veröffentlichen?
Vierten, wie funktioniert params
Arbeit mit form_for
? In diesem follow-Taste Fall params[:relationship][:followed_id]
zurück @user.id
im controller. Woher weiß er das erste hash-Attributs ist :relationship
? Wir haben weder erwähnt form_for :relationship
noch form_for @relationship
.
Ich weiß, diese Frage ist sehr dumm, aber ich bin wirklich stecken. Jede Hilfe wird geschätzt.
InformationsquelleAutor Ivan Wang | 2013-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich nicht tun, das tutorial so mir nichts, wenn ich keine direkte Antwort auf deine Frage.
Werfen Sie einen Blick auf die rails guide über die form-Helfer und es erklärt im Detail Ihre Fragen, die wahrscheinlich in eine mehr artikulieren Weg, als ich kann.
form_for(path/to/your/controller/action)
ist eine helper-Methode zum erstellen von HTML-Formular-Elemente mit den url-Pfad zum POST-oder GET-Anfrage. Der Helfer kennt, sollte es sich um einen neuen Datensatz oder ein Datensatz aktualisieren, basierend auf, was Sie Fragen zu tun, die in Ihrem controller-Aktion.Beispielsweise
In Ihrem controller
Ihrer Ansicht nach neue.html-Code.erb
In deinem Fall die Logik war direkt in der Helfer-und Sie könnte auch direkt schreiben
Beiden wird mit der folgenden html -
Dann die
hidden_field
ist ein weiterer Helfer, um einen Wert enthalten, in Ihrem Fall die@user.id
übergeben wird als parameter gespeichert, wie ein Create-oder update-Aktion für das angegebene Objekt. Der Grund, es nicht fügen Sie den Wert in das hidden-Feld-tag ist, da Sie bereits eine Modell-Verein, kennt die user-id, da der link der form verwendet die build-Methode mit der Benutzer-id.Letzten Teil, den Sie brauchen, um zu verstehen, die form_for-link-Logik
in
form_for current_user.relationships.build(followed_id: @user.id)
, dieform_for
muss nur der erste Teilcurrent_user.relationships.build
. Das bedeutet, dass der Letzte Teil(followed_id: @user.id)
ist nicht nötig, hab ich Recht? Oder spielt er einige Rollen zu helfen, hidden_field Wert? Ich denke, dass ich noch nicht die Antwort auf meine erste und zweite Frage. Vielleicht sollte ich mehr Zeit zum Lesen der Rails-Guides, die Sie vorgeschlagen, ersten. DankSie brauchen, um zu sagen Schienen, was Sie bauen wollen, mit der entsprechenden info, also ja, Sie müssen den letzten Teil. Die build-Methode wird verwendet, wenn es ein Modell Verband. Sie können sich die [api] (api.rubyonrails.org/classes/ActiveRecord/Associations/...). Wenn Sie nicht, fügen Sie das @user.id dann followed_id wird mit null.
Ja, Sie letztlich zu den create-Aktion, die ist, was Sie wollen ;).build-Methode bereits gebaut das Objekt mit den info, die Sie gerade brauchen, um es zu retten, und das ist, was die create-action ist für. Die neue Aktion ist nur eine Seite, wo Sie eine form und lassen Sie die Benutzer schreiben die Informationen, dann auf submit leitet er Aktion erstellen und speichern, es sei denn, die Validierungen fehlschlagen.
InformationsquelleAutor Aurelien Schlumberger
Nach der Lektüre des Buches Die Schienen, 4-Weg -, ich verstehe form_for jetzt besser.
in dieser Weise, wenn wir bauen die Beziehung, die durch die Verwendung
current_user.relationships.build(followed_id: @user.id)
die Beziehung Instanz erstellt werden und gewinnen Attributfollowed_id
. Also, dass anstelle von "erstellen" einer Beziehung, wir sind eigentlich die Bearbeitung der Beziehung, die durch die form.Dann Schienen wird wissen, die Sie Bearbeiten und laden Sie das vorhandene Attribut "followed_id" in das Feld. Daher, brauchen wir nicht, um einen Wert zuweisen zu Feld wie mit
f.hidden_field :followed_id, value: @user.id
.Und der Grund, warum wir Sie verwenden ein Feld zu übergeben followed_id, params, weil der HTTP-server ist zustandslos, es erinnert sich nicht daran, Sie erstellen eine Beziehung mit dem Benutzer.
Einer der Vorteile des Schreibens
form_for current_user.relationships.build(followed_id: @user.id)
anstelle von standard -form_for @relationship
ist brauchen wir nicht zu schreiben "wenn-Bedingung" in den controller wie diesem:params wird an den controller gesendet werden, das gehört zu der Instanz-Modell. Methode "post" wird auf "Aktion" erstellen, "löschen" gehen, um zu zerstören, "patch" gehen wird, zu aktualisieren, usw.
params wird ein Hashwert mit einem anderen hash-innen wie { instace_name: { field_1: Wert1, feld_2:Wert2 } } oder full params, wie unten
InformationsquelleAutor Ivan Wang