2009-05-24 1 views
0

wir verwendenIn Rails verwenden wir form_for @story do | f | wenn es keine Schleife gibt?

(1..10).each do |i| 
    p i 
end 

, so dass ein Wert ist "Ausbeute" an i in einem Block ...

aber was

<% form_for @story do |f| %> 
    <%= f.text_field :name %> 
<% end %> 

es überhaupt keine Schleife ist ... Warum müssen wir es wie eine Schleife aussehen lassen? Können wir es nicht machen, ohne dass es wie eine Schleife aussieht? (anders schreiben)?

Muss auch hier eine Story-Instanz verwendet werden? Können wir nicht einfach eine Story verwenden und dasselbe Ergebnis erzielen? Die @story-Instanz wurde gerade neu erstellt und enthält überhaupt keine Daten - trägt sie tatsächlich zur Erstellung des Formulars bei? Kann nicht: Geschichte schon genügen? Vielen Dank.

Update:

ist die Idee, ähnlich wie: (nur Pseudo-Code)

with_model_give_form (@story) do |f| 
    f.begin_form 
    f.text_field :name 
    f.end_form 
end 

so denke ich, der Block Methode wird die begin_form und END_FORM sparen, weil es automatisch den Beginn und das Ende hinzufügen vor und nach dem Aufruf des Blocks. Ist das der Hauptvorteil?

Antwort

6

Ich denke, Sie haben die Funktionsweise von Ruby in diesem Fall falsch verstanden.

Es ist wahr, dass Sie alles in einem Block setzen, aber es hat nichts mit einer Schleife zu tun hat.

Was Sie tun, tatsächlich in

(1..10).each do |i| 
    p i 
end 

schafft den Block {|i| p(i); } und es an die Funktion Senden Range.each()

Es ist die gleiche Sache mit dem form_for. Sie erstellen den Block {|f| puts(f.text_field(:name)); } und übergeben ihn an die Funktion form_for. (jetzt verwendet es keine Puts, aber eine String-Verkettung, aber Sie bekommen die Idee).

es ist also im Grunde nicht eine Schleife, sondern eine Lambda-Funktion, die mehrmals aufgerufen wird, wenn in einer Schleife aufgerufen.

Here is some more information about blocks

Update: In Bezug auf das Update. In gewisser Weise, das ist der Hauptvorteil. Es ist nicht ganz richtig, aber Sie bekommen die Idee. Der Zweck für diesen Block (und viele andere) besteht darin, den Code leichter lesbar und verständlich zu machen. Und auch um die Entwicklung zu beschleunigen.

Seit immer wird nach Code in Blöcken gesucht, schauen Sie sich einfach das Konzept von Funktionen, Klassen und anderen Anweisungen an.

zum Beispiel ist die form_for meist für die Beschleunigung der Entwicklung. Ja, es erstellt die Start- und End-Tags, aber das ist nicht alles.

<% form_for @story do |f| %> 
    <%= f.text_field :name -%> 
<% end %> 

könnte tatsächlich so etwas wie geschrieben werden:

<form action="<%= polymorphic_edit_path(@story) -%>" 
     id="<%= @story.class_name.underscore -%>"> 
    <%= text_field :story, :name -%> 
</form> 

natürlich wäre es nicht genau so sein, dann ist dies viel vereinfacht und die form_for Funktion viel mehr als das tun können, aber zumindest solltest du das Bild bekommen.

+0

Ich habe etwas in der Frage hinzugefügt ... ist es so etwas wie der Update-Teil? –

0

A „Ausbeute“ nicht immer eine Schleife implizieren - es eher ein „Block“ -Konzept ist, es passiert einfach selbst von einem Iteration/Loop-Kontext in mehr zu manifestieren. Je mehr Sie darüber nachdenken, dass Ertrag ein Loop-Konstrukt ist, desto mehr werden Sie sich selbst in die Schublade stecken und verhindern, dass Sie wirklich die Großartigkeit von Blöcken lernen.

In Bezug auf: Geschichte, ja, es ist irgendwie lahm. Sie würden denken, dass Rails es einfach konstant machen und von dort auf sein Modell schließen würde. Du könntest auch einfach nur Story.new aus deiner Sicht sehen, versus das in deinem Controller, aber ja, es ist dasselbe.

+0

ist es so etwas wie in meinem Update? –

Verwandte Themen