5
<% form_tag(:action=>'update', :id=>@album.id) do %> 

    Title: <%= text_field(:album, :title) %><br> 
    Artist: <%= text_field(:album, :artist) %><br> 
    Genre: <%= text_field(:album, :genre) %><br> 
    Release Date: <%= datetime_select(:album, :release_date, :start_year=>1960) %><br> 

    <%= submit_tag("Update") %> 

    <% end %> 

Im obigen Beispiel, was funktioniert, musste ich @ album.id im form_tag sagen, aber im text_field musste ich sagen: album. Ich verwechsle diese in meinen Ansichten und weiß nie wirklich, ob ich ein @ -Zeichen oder ein Symbol verwenden soll. Gibt es eine einfache Regel, die klarstellt, was wann zu verwenden ist?Wann @ in einer Rails-Ansicht verwendet werden soll und wann ein Symbol verwendet werden soll?

Antwort

14

Ich gehe hier für einen Moment auf eine Tangente gehen, aber ertragen Sie mit mir.

Zunächst empfehle ich Ihnen RESTful routing zu verwenden, da dies Sie bessere Methoden und Operationen wie in der Lage zu tun, den Zugriff auf einige Rails gibt:

form_for(@album) do |f| 

und nachdem er sie, wo Sie sich basierend hinwollen auf dem #new_record? Zustand dieses Objekts.

Zweitens mit dem neuen form_for an Ort und Stelle, können Sie Ihre Ansichten vertrocknen, indem Sie:

<%= f.text_field :title %> 

statt:

<%= text_field :album, :title %> 

Und schließlich die Erklärung, warum ein Variable wird in Rails mit einem @ -Zeichen davor definiert, auch bekannt als "Instanzvariablen":

Wenn Sie eine Instanzvariable in Rails definieren, ist sie innerhalb dieser Variable verfügbar Instanz für die gesamte Anfrage, wo die "Instanz" ist die ActionController und ActionView Kette von Methoden, die aufgerufen werden, um alle Rendering und so weiter für Sie zu tun. Wenn Sie es als Instanzvariable definieren, wird es in Ihrem Controller verfügbar, jede Methode, die Sie aufrufen, nachdem Sie es im Controller definiert haben, Ihre Helfer, Ihre Ansichten und die Partials, die von Ihren Controllern, Helfern oder Ansichten gerendert werden.

Grundsätzlich ist es für die gesamte Anfrage, aber nicht in Ihrem Modell zugänglich. Andere Variablenspezifikationen sind Klassenvariablen (@@some_useful_thing = 1) und globale Variablen ($some_other_useful_thing = 1) und Konstanten (ALL_IN_UP_CASE = 1).

+0

Danke. Ich muss in REST schauen. Ich habe an einigen Tutorials zu Rails 1.1.6 gearbeitet und bin noch nicht dazu gekommen. Mit form_for ist also text_field (: album,: title) nicht notwendig, da der Name des: album bereits bekannt ist, da f.text_field Teil des Formulars ist, auf das Sie mit do | f | Ich denke, ich verstehe es. Vielen Dank. –

6

Das @ -Symbol vor einem Variablennamen verweist auf eine Instanzvariable in der aktuellen Klasse. Das Präfix: (Doppelpunkt) erstellt ein Symbol. In Ihrem Beispiel sendet @album.id die ID der Instanzvariable @album an form_tag, sodass form_tag dieses Objekt aus der Datenbank einlesen und die Formularfelder mit den entsprechenden Daten aus diesem Objekt ausfüllen kann. Die Symbole, die Sie in den Methoden text_field übergeben, werden von form_tag verwendet, um auf bestimmte Eigenschaften des Objekts zuzugreifen, das von der Datenbank erstellt wird. Es fügt dann die Werte dieser Eigenschaften in die Textfelder ein, die es generiert.

+0

Also das text_field weiß nichts über das Album, nur weil es vom form_tag eingeschlossen ist, das bereits einen Verweis darauf hat. Wie Radar sagt, wäre form_for eine Lösung für diese Wiederholung. Ich denke, ich verstehe das jetzt. Danke für die Erklärung. –