2009-05-26 23 views
2

Wenn wir validate_presence_of: name im Modell haben und dann die create-Aktion einfügen, die wir 'neu' neu rendern, dann füllt form_for die Felder und error_messages_for 'story' die korrekte Fehlermeldung.on Rails, wie funktioniert form_for und validate_presence_of Hand in Hand?

das ist wirklich toll, und und zur gleichen Zeit sieht das aus wie Magie ... ich fand, dass viele Bücher nicht erklären, wie die Magie auftritt. ist es durch eine globale Variable?

Wenn die form_for aufgerufen wird ... verwendet sie die @story, die von der @ story.save zurückkam, anstatt der @story = Story.new von der neuen Aktion? wenn ich also: story für das form_for verwende, werden die felder bei fehler nicht gefüllt?

manchmal fühle ich, dass ich Magie spiele, wenn ich Ruby on Rails benutze, außer dass ich nicht weiß, wie die Magie passiert ... irgendwie, als würde ich das Kaninchen erscheinen lassen, aber ich weiß nicht, wie ich es gemacht habe es. Ich möchte also wirklich die inneren Abläufe von Rails kennenlernen.

Antwort

6

Ja, Rails ist sehr magisch. Leider sind das nur Dinge, mit denen man leben muss, und sobald man sich an die Konventionen gewöhnt hat, kann man mit der Magie einige sehr komplizierte Dinge mit großer Leichtigkeit ausführen.

Es gibt drei separate Probleme, die hier relativ einfach sind, aber sehr magisch wirken, wenn man alles auf einmal aufnimmt. Lassen Sie sie nacheinander zerlegen:

Wenn Validierungen fehlschlagen, verhindern sie das Speichern des Modellobjekts und fügen dem object.errors-Hash Fehler hinzu.

Wenn Sie @ story.save ausführen, werden alle Validierungen gestartet. Da @ story.name leer ist, fügt validates_presence_of: name dem Objekt einen Fehler hinzu.

Instanzvariablen in der Steuerung sind für die Ansichten verfügbar, die sie rendern.

Also, es ist die gleiche @ story, auf die die Ansicht Zugriff hat - die eine, die ungültig ist und an die Fehlerinformationen angehängt sind.

form_for nimmt viele Formen an, und die, die Sie verwenden ist sehr intelligent

Die form_for Tag Ihrer Ansicht nach sieht wohl so aus:

<%= form_for @story do |story| => 

Dies ist eine spezielle Version von form_for Dies leitet alle Arten von Informationen von dem übergebenen Objekt ab und rendert das Formular entsprechend. @story hat einige seiner Felder wegen der

@story = params[:story] 

in Ihrem Controller Linie bevölkert, so geht es weiter und füllt für Sie in diesen Bereichen. Es tut auch einige andere Dinge - zum Beispiel überprüft es @ story.new_record? um zu sehen, ob es die POST-HTTP-Methode (RESTful create) oder die PUT-Methode (RESTful update) verwenden soll.

Zusammenfassend gibt es viele kleine magische Dinge zu lernen, aber sobald Sie die große Magie tun, ist es viel einfacher zu verstehen. Viel Glück!