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 %> 

En el ejemplo anterior, que funciona, tuve que decir @ album.id en el form_tag pero en el campo text_field tuve que decir: album. Sigo confundiendo estos en mis puntos de vista y nunca sé realmente si usar un signo @ o un símbolo. ¿Existe una regla simple que pueda aclarar qué usar cuando?Cuándo usar @ en una vista de rieles y cuándo usar un símbolo?

Respuesta

14

Voy por una tangente aquí por un momento, pero tengan paciencia conmigo.

En primer lugar, recomiendo que utilice RESTful routing ya que esto le da acceso a algunos de los carriles de mejores métodos y operaciones tales como ser capaz de hacer:

form_for(@album) do |f| 

y tener que calcular dónde quiere ir basada en el estado #new_record? de ese objeto.

En segundo lugar, con el nuevo form_for en su lugar, usted será capaz de secar sus puntos de vista haciendo:

<%= f.text_field :title %> 

en lugar de:

<%= text_field :album, :title %> 

Y por último, la explicación de por qué una variable se define con un signo @ antes en Rails, también conocido como "variables de instancia":

Cuando define una variable de instancia en Rails, está disponible dentro de ese instancia para toda la solicitud donde la "instancia" es la cadena de métodos ActionController y ActionView a la que se llama para hacer todo el renderizado y así sucesivamente. Definirlo como una variable de instancia lo hará disponible en su controlador, cualquier método que llame después de definirlo en el controlador, sus ayudantes, sus vistas y los parciales representados desde sus controladores, ayudantes o vistas.

Básicamente, está disponible para toda la solicitud, pero no es accesible dentro de su modelo.

Otras especificaciones de variables son variables de clase (@@some_useful_thing = 1) y variables globales ($some_other_useful_thing = 1) y constantes (ALL_IN_UP_CASE = 1).

+0

Gracias. Tengo que mirar hacia REST. Trabajando en algunos tutoriales sobre Rails 1.1.6 y aún no hemos llegado a eso. Entonces, con form_for, text_field (: album,: title) no es necesario porque el: nombre del álbum ya se conoce porque f.text_field es parte del formulario al que hace referencia con do | f |. Creo que lo entiendo Gracias. –

6

El símbolo @ antes de un nombre de variable se refiere a una variable de instancia en la clase actual. El prefijo: (dos puntos) crea un símbolo. En su ejemplo, @album.id está enviando el id. De la variable de instancia @album a form_tag, permitiendo que form_tag lea en ese objeto de la base de datos y complete los campos de formulario con los datos apropiados de ese objeto. Los símbolos que pasa en los métodos text_field son los que usa form_tag para acceder a propiedades específicas en el objeto que crea desde la base de datos. A continuación, coloca los valores de esas propiedades en los campos de texto que genera.

+0

Así que text_field no conoce el álbum solo porque está encerrado por el form_tag que ya tiene una referencia. Como dice Radar, form_for sería una solución a esta repetición. Creo que estoy entendiendo esto ahora. Gracias por la explicación. –

Cuestiones relacionadas